当前位置: 首页 > 面试题库 >

处理多个SIGCHLD

易扬
2023-03-14
问题内容

在运行Linux
2.6.35+的系统中,我的程序创建了许多子进程并对其进行监视。如果子进程死了,我会进行一些清理并再次产生该进程。我signalfd()经常SIGCHLD在过程中获取信号。signalfd与异步使用libevent

当将信号处理程序用于非实时信号时,当信号处理程序针对特定信号运行时,必须阻止同一信号的进一步出现,以避免进入递归处理程序。如果此时有多个信号到达,则内核仅调用一次处理程序(当信号被解除阻塞时)。

使用时是否具有相同的行为signalfd()?由于signalfd基于处理没有与正常执行信号处理程序的异步执行相关的典型问题,所以我认为内核可以将所有进一步出现的事件排入
队列SIGCHLD

任何人都可以在这种情况下阐明Linux行为吗?


问题答案:

在Linux上,在阅读SIGCHLDwith
之前终止的多个子代signalfd()将被压缩为单个SIGCHLD。这意味着,当您读取SIGCHLD信号时,必须在 所有
终止的子级之后进行清理:

// Do this after you've read() a SIGCHLD from the signalfd file descriptor:
while (1) {
    int status;
    pid_t pid = waitpid(-1, &status, WNOHANG);
    if (pid <= 0) {
        break;
    }
    // something happened with child 'pid', do something about it...
    // Details are in 'status', see waitpid() manpage
}

我应该注意,实际上两个子处理程序同时终止时,我已经看到了这种信号压缩。如果我只做一次waitpid(),那么终止的孩子之一将不会得到处理。并且上面的循环修复了它。

相应的文档:

  • http://man7.org/linux/man-pages/man7/signal.7.html “相比之下,如果在当前阻塞标准信号的情况下交付了多个标准信号实例,则只有一个实例排队”
  • http://man7.org/linux/man-pages/man3/sigwait.3p.html “如果在调用sigwait()之前存在多个单个信号编号的挂起实例,则是否实现取决于实现定义返回该信号号的剩余未决信号。”


 类似资料:
  • 问题内容: 我是新手,发现错误处理非常冗长。我已经读过它的理由并大体上同意,但是似乎在某些地方似乎有更多代码来处理错误而不是实际工作。这是一个(人为的)示例,我在其中传送“ Hello world!”。进入cat并读取并打印输出。基本上,每一行都可以再处理三个错误,而我什至没有处理任何事情。 有没有惯用的,干净的方法来处理此问题?我只是觉得我在想什么。 问题答案: 显然,我们必须处理任何错误。我们

  • 问题 你有一个代码片段可能会抛出多个不同的异常,怎样才能不创建大量重复代码就能处理所有的可能异常呢? 解决方案 如果你可以用单个代码块处理不同的异常,可以将它们放入一个元组中,如下所示: try: client_obj.get_url(url) except (URLError, ValueError, SocketTimeout): client_obj.remove_url(u

  • 我必须在Spring批处理作业中实现以下用例: 通过读取提供程序列表 遍历列表,并为步骤1中找到的每个提供程序(作为输入参数)调用另一个。 第二个SP的输出将写入CSV。 我提出了以下策略: 第1步开始 SP ItemReader返回提供程序列表。 在ItemWriter中,将提供程序保存到 步骤1结束 第2步开始 另一个SP项目读取器从访问提供程序 另一个ItemWriter使用FlatFile

  • 我们使用Spring Batch进行一些处理,通过Reader读取一些ID,我们希望通过处理器将它们处理为“块”,然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方,不能为每个项目调用服务。 我看到我们可以为“块”中涉及的所有读取器-处理器-写入器创建包装器,以处理列表<>并委托给一些具体的读取器/处理器/写入器。但这对我来说并不是件好事。像这样:

  • 最大消息长度为64K字节(尽管我可以将其减少到256字节)。 注意:这将运行在一个微小的嵌入式设备上,所以使用像ZMQ这样的消息传递层不是一个选项(没有足够的内存)。 我可以:

  • 我想创建一个未来列表,每个未来都可能通过或失败,并整理成功未来的结果。我该怎么做? 问题1)我想等待每个未来完成2)我想从每个成功的未来收集返回值的总和,并忽略失败的回报值(所以我应该得到3)。