簡體   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