簡體   English   中英

system() 函數,而 SIGCHLD 被忽略

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM