SIGCHLD和fork + waitpid()在库中

时间:2018-09-20 20:25:09

标签: c linux fork waitpid

我正在编写一个使用fork()exec()来运行外部程序的库。 我库中的代码作为单独的线程运行。 库线程需要在派生的进程上waitpid()才能知道子进程的退出代码。

不幸的是,如果使用我的库的应用程序为SIGCHLD注册了信号处理程序,则waitpid()调用将返回错误ECHILD

在应用程序影响最小的情况下,如何将其作为库处理? 我本质上是希望孩子保持僵尸状态并控制收割的时间。

我可以使自己与应用程序决定做什么隔离吗? 我可以以某种方式劫持信号处理程序并在完成waitpid之后将其放回去吗?

2 个答案:

答案 0 :(得分:0)

释放库分配的资源是一个应用程序错误。原则上,就像该应用程序进行了free(yourlib_create_context(...))之类的操作一样,尽管后果不那么严重。没有理由尝试支持这种荒谬的应用程序行为。只需证明它无效即可。

如果您要“屏蔽”此类编程错误,请在abort失败并返回waitpid的情况下,屏蔽信号并调用ECHLD。这将无条件终止该过程,而申请人没有任何机会抓住它。

答案 1 :(得分:0)

您可以像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);
}

// ...