[英]SIGCHLD and fork + waitpid() in a library
我正在编写一个使用fork()
和exec()
运行外部程序的库。 我库中的代码作为单独的线程运行。 库线程需要在派生进程上使用waitpid()
来知道子进程的退出代码。
不幸的是,如果使用我的库的应用程序为SIGCHLD
注册了信号处理程序,则waitpid()
调用将返回错误ECHILD
。
我如何将其作为库处理,而对应用程序的影响却最小? 我本质上是希望孩子保持僵尸状态并控制收割时间。
我可以使自己与应用程序决定做什么隔离吗? 我可以以某种方式劫持信号处理程序,并在完成waitpid
之后放回去吗?
释放库分配的资源是一个应用程序错误。 就原理而言,就像应用程序执行了free(yourlib_create_context(...))
,尽管其后果当然不那么严重。 没有理由尝试支持这种荒谬的应用程序行为。 只需证明它无效即可。
如果您想“屏蔽”这种编程错误,则在waitpid
失败并ECHLD
,mask会发出信号,然后调用abort
。 这将无条件终止该过程,而申请人没有任何机会抓住它。
您可以像system
一样进行操作:
system()通过调用/ bin / sh -c命令执行命令中指定的命令,并在命令完成后返回。 在执行命令期间, SIGCHLD将被阻止 ,并且SIGINT和SIGQUIT将被忽略。
大纲可能是
pid_t pid;
sigset_t block, backup;
sigemptyset(&block);
sigaddset(&block, SIGCHLD);
sigprocmask(SIG_BLOCK, &block, &backup);
if ((pid = fork()) < 0) {
// error handle
} else if (pid == 0) { // child
sigprocmask(SIG_SETMASK, &backup, NULL);
// ...
} else {
// waitpid
sigprocmask(SIG_SETMASK, &backup, NULL);
}
// ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.