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