[英]system() function while SIGCHLD is ignored
這是我的代碼的一個示例
signal(SIGCHLD, SIG_IGN);
ret = system("ls -al");
if(ret < 0)
{
perror("system failed");
printf("return value is %d\n", ret);
}
ls -al
命令可以毫無問題地執行。
但system()
的返回值始終為 -1。 在這種情況下,我無法獲得命令的真實返回值。
一些參考資料說忽略 SIGCHLD 會影響system()
中的waitpid()
system()
,這就是system
總是返回 -1 的原因。
但更讓我困惑的是:默認情況下不是忽略 SIGCHLD 嗎? 那么為什么顯式忽略 SIGCHLD 會導致這種情況呢?
有人可以向我解釋一下嗎?
感謝@cnicutar 現在我明白了忽略 SIGCHLD 的影響。
但是現在我想知道是否有任何方法可以在忽略 SIGCHLD 的情況下獲取子進程的返回值? 或者由於 POSIX 規范和操作系統實現,這是不可能的?
但更讓我困惑的是:默認情況下不是忽略 SIGCHLD 嗎?
不,默認情況下它不會被忽略。 默認情況下,根本沒有處理程序,也不采取任何行動。
那么為什么顯式忽略 SIGCHLD 會導致這種情況呢?
忽略SIGCHLD
有一個有趣的副作用:孩子不會變成僵屍。
POSIX.1-2001 規定,如果 SIGCHLD 的處置設置為 SIG_IGN 或為 SIGCHLD 設置了 SA_NOCLDWAIT 標志(請參閱 sigaction(2)),則終止的子進程不會變成僵屍並且調用
wait()
或waitpid()
將阻塞,直到所有子進程都終止,然后失敗,將 errno 設置為 ECHILD。
也就是說,您無需再等待孩子,因為他們會被自動收集。 但是system(3)
期待一個孩子! 所以waitpid
返回一個錯誤並且system(3)
行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.