繁体   English   中英

SIGCHLD和fork + waitpid()在库中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM