我開始使用execv
並讓它寫入文件的過程。我使用stat.st_size
同時啓動一個線程來監視文件,使其大小不超過某個限制。現在,當限制被擊中時,I waitpid
用於子進程,但是這會引發錯誤,並且我在後臺啓動的進程變成殭屍。當我在主線程中使用相同的waitpid
來停止時,該進程會被殺死而不會成爲殭屍。有任何想法嗎?waitpid爲子進程未成功
編輯:errno
是10和waitpid
返回-1。這是在Linux平臺上。
我開始使用execv
並讓它寫入文件的過程。我使用stat.st_size
同時啓動一個線程來監視文件,使其大小不超過某個限制。現在,當限制被擊中時,I waitpid
用於子進程,但是這會引發錯誤,並且我在後臺啓動的進程變成殭屍。當我在主線程中使用相同的waitpid
來停止時,該進程會被殺死而不會成爲殭屍。有任何想法嗎?waitpid爲子進程未成功
編輯:errno
是10和waitpid
返回-1。這是在Linux平臺上。
這是很難無代碼調試,但errno
10是ECHILD
。
%的人頁面,這將返回如下:
ECHILD
(用於waitpid()
或waitid()
)由pid
(waitpid()
)或idtype
和id
(waitid()
)指定的進程不存在或不是一個呼叫過程的孩子。 (發生這種情況的一個自己的孩子,如果爲SIGCHLD
的操作設置爲SIG_IGN
。另請參見有關線程Linux的註釋部分。)
總之,你指定pid
不是過程調用的孩子waitpid()
(或不再是,也許是因爲它已經終止)。
注意括號部分:
「如果SIGCHLD
的操作設置爲SIG_IGN
造成這種情況的一個自己的孩子」 - 如果你設置了一個信號處理器爲SIGCHLD
是SIG_IGN
,wait
有效地自動完成,因此waitpid
將無法正常工作,因爲孩子已經終止(不會經歷殭屍狀態)。
「另請參閱有關線程的Linux註釋部分。 - 在Linux中,線程本質上就是進程。現代linux將允許一個線程等待其他線程的子進程(只要它們在同一個線程組中 - 大致爲父進程)。如果您在2.4之前使用Linux,則情況並非如此。有關詳細信息,請參閱__WNOTHREAD
上的文檔。
我猜線程的是一個紅色的鯡魚,這個問題實際上是信號處理程序,因爲這與你的說法相符「的過程中被殺害,而沒有變成一個殭屍。」
我沒有爲SICHLD設置信號處理程序。所以這不應該是問題。我正在使用2.6內核,它應該隱式允許我的線程等待主線程創建的進程。但是這並沒有發生。我爲waitpid設置__WALL和__WCLONE選項無濟於事。我會繼續探索並回復你。謝謝你的建議。 – user1295872
「但是這會拋出一個錯誤...」,那個錯誤會是...什麼?包括錯誤代碼和所有相關消息傳遞*逐字*在您發佈的問題。可能還包括平臺信息。 – WhozCraig
waitpid返回-1,errno設置爲10. errno似乎表明子進程不存在。但似乎並非如此,因爲我能夠用ps ax來看待這個過程。操作系統是Linux。 – user1295872
這將在*評論*。這些信息屬於你發佈的問題*無論如何,也許是關於「Linux Notes」[在'waitpid'文檔中]的部分(http://linux.die。net/man/2/waitpid)可能有關係。 – WhozCraig