jjzjj

c - 使用 waitpid 或 sigaction?

我了解到:1)waitpid用于等待一个child死亡,然后收集SIGCHLD和child的退出状态等。2)当我们有SIGCHLD的信号处理程序时,我们会做一些与清理child或其他东西(由程序员决定)相关的更多事情,然后做一个waitpid,这样child就不会变成僵尸然后返回。现在,当我们执行fork/exec并且子进程返回时,我们的程序中是否需要同时包含1和2?如果两者都有,则先获取SIGCHLD,因此信号处理程序先被调用,因此它的waitpid被成功调用,而不是父进程代码中的waitpid,如下所示:my_signal_handler_for_sigchld{dosomethi

c - wait3(waitpid别名)在不应将errno设置为ECHILD的情况下返回-1

上下文是Redisissue。我们有一个wait3()调用,等待AOF重写子级在磁盘上创建新的AOF版本。当child完成后,将通过wait3()通知parent,以便用新的AOF替换旧的AOF。但是,在上述问题的背景下,用户通知了我们一个错误。我修改了Redis3.0的实现,以清楚地记录wait3()返回-1的时间,而不是由于此意外情况而崩溃。因此,显然是这样的:当我们有未决child等待时,会调用wait3()。SIGCHLD应该设置为SIG_DFL,Redis中根本没有代码设置此信号,因此这是默认行为。第一次AOF重写发生时,wait3()成功按预期工作。从第二次AOF重写(创建

c++ - Waitpid 等效于超时?

假设我有一个启动多个子进程的进程。parent需要知道child何时退出。我可以使用waitpid,但是如果/当父级需要退出时,我无法告诉在waitpid中阻塞的线程正常退出并加入它。让事情自己清理是件好事,但可能没什么大不了的。我可以将waitpid与WNOHANG一起使用,然后休眠一段时间以防止忙碌等待。但是,我只能知道child是否经常退出。就我而言,我知道child何时离开可能不是很重要,但我想尽快知道......我可以为SIGCHLD使用信号处理程序,并在信号处理程序中执行当child退出时我将要执行的任何操作,或者将消息发送到不同的线程以执行某些操作。但是使用信号处理程序会