我正在编写一个使用fork()
和exec()
来运行外部程序的库。
我库中的代码作为单独的线程运行。
库线程需要在派生的进程上waitpid()
才能知道子进程的退出代码。
不幸的是,如果使用我的库的应用程序为SIGCHLD
注册了信号处理程序,则waitpid()
调用将返回错误ECHILD
。
在应用程序影响最小的情况下,如何将其作为库处理? 我本质上是希望孩子保持僵尸状态并控制收割的时间。
我可以使自己与应用程序决定做什么隔离吗?
我可以以某种方式劫持信号处理程序并在完成waitpid
之后将其放回去吗?
答案 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);
}
// ...