2015-05-04 80 views
1

我開始使用execv並讓它寫入文件的過程。我使用stat.st_size同時啓動一個線程來監視文件,使其大小不超過某個限制。現在,當限制被擊中時,I waitpid用於子進程,但是這會引發錯誤,並且我在後臺啓動的進程變成殭屍。當我在主線程中使用相同的waitpid來停止時,該進程會被殺死而不會成爲殭屍。有任何想法嗎?waitpid爲子進程未成功

編輯:errno是10和waitpid返回-1。這是在Linux平臺上。

+0

「但是這會拋出一個錯誤...」,那個錯誤會是...什麼?包括錯誤代碼和所有相關消息傳遞*逐字*在您發佈的問題。可能還包括平臺信息。 – WhozCraig

+0

waitpid返回-1,errno設置爲10. errno似乎表明子進程不存在。但似乎並非如此,因爲我能夠用ps ax來看待這個過程。操作系統是Linux。 – user1295872

+0

這將在*評論*。這些信息屬於你發佈的問題*無論如何,也許是關於「Linux Notes」[在'waitpid'文檔中]的部分(http://linux.die。net/man/2/waitpid)可能有關係。 – WhozCraig

回答

1

這是很難無代碼調試,但errno 10是ECHILD

%的人頁面,這將返回如下:

ECHILD(用於waitpid()waitid())由pidwaitpid())或idtypeidwaitid())指定的進程不存在或不是一個呼叫過程的孩子。 (發生這種情況的一個自己的孩子,如果爲SIGCHLD的操作設置爲SIG_IGN。另請參見有關線程Linux的註釋部分。)

總之,你指定pid不是過程調用的孩子waitpid()(或不再是,也許是因爲它已經終止)。

注意括號部分:

  • 「如果SIGCHLD的操作設置爲SIG_IGN造成這種情況的一個自己的孩子」 - 如果你設置了一個信號處理器爲SIGCHLDSIG_IGNwait有效地自動完成,因此waitpid將無法​​正常工作,因爲孩子已經終止(不會經歷殭屍狀態)。

  • 「另請參閱有關線程的Linux註釋部分。 - 在Linux中,線程本質上就是進程。現代linux將允許一個線程等待其他線程的子進程(只要它們在同一個線程組中 - 大致爲父進程)。如果您在2.4之前使用Linux,則情況並非如此。有關詳細信息,請參閱__WNOTHREAD上的文檔。

我猜線程的是一個紅色的鯡魚,這個問題實際上是信號處理程序,因爲這與你的說法相符「的過程中被殺害,而沒有變成一個殭屍。」

+0

我沒有爲SICHLD設置信號處理程序。所以這不應該是問題。我正在使用2.6內核,它應該隱式允許我的線程等待主線程創建的進程。但是這並沒有發生。我爲waitpid設置__WALL和__WCLONE選項無濟於事。我會繼續探索並回復你。謝謝你的建議。 – user1295872

相關問題