[英]waitpid() function returns ERROR (-1), why?
我正在 C 中編寫一個 Linux 類 shell 程序。
其中,我正在實現兩個內置命令: jobs, history.
在jobs
中,我打印當前工作命令的列表(在后台)。 在history
中,我打印了迄今為止所有命令歷史記錄的列表,並為每個命令指定它是 RUNNING 還是 DONE。
為了實現這兩者,我的想法是有一個命令列表,將命令名稱映射到它們的 PID。 一旦調用了作業/歷史命令,我就會運行它們,檢查哪些正在運行或已完成,並相應地打印。
我在網上讀到 function: waitpid(pid, &status, WNOHANG)
,可以從“PID”檢測進程是否仍在運行或完成,而無需停止進程。 它工作得很好,除了這個:
當程序處於活動狀態時,function 會返回它。 當一個程序完成時,我第一次調用它返回完成,然后從那里,如果再次使用相同的 PID 調用,它返回 -1(錯誤)。
例如,它看起來像這樣:(& 表示背景命令)
$ sleep 3 &
$ jobs
sleep ALIVE
$ jobs (withing the 3 seconds)
sleep ALIVE
$ jobs (after 3 seconds)
sleep DONE
$ jobs
sleep ERROR
$ jobs
sleep ERROR
....
此外,這些不受我之前或之后可能執行的其他命令調用的影響,似乎上述行為獨立於其他命令。
我在網上閱讀了waitpid
可能返回 -1 的各種原因,但我無法確定我的情況的原因。 另外,我嘗試尋找如何理解它是什么類型的waitpid
錯誤,但再次失敗。
我的問題是:
這個問題的一個解決方案是,一旦我得到“DONE”,我將命令簽署為 DONE,並且在打印之前不再對其執行waitid
。 這將解決問題,但我會一直處於黑暗中,為什么會發生這種情況
您應該熟悉如何在 Unix 環境中處理子進程。 特別閱讀有關僵屍進程的信息。
當一個進程死亡時,它會進入一個“僵屍”state,因此它的 PID 仍然被保留並唯一標識現在死亡的進程。 對僵屍進程的成功wait
會釋放進程描述符及其 PID。 因此,后續調用wait
同一 PID 將失敗,因為沒有更多具有該 PID 的進程(除非為新進程分配了相同的 PID,在這種情況下等待它將是一個邏輯錯誤)。
您應該重組您的程序,以便如果wait
成功並報告進程為DONE
,則將該信息記錄在您自己的數據結構中,並且不再對該 PID 調用wait
。
為了比較,一旦一個過程完成,bourne shell 最后一次報告它,然后從作業列表中刪除它:
$ sleep 10 &
$ jobs
[1] + Running sleep 10
$ jobs
[1] + Running sleep 10
$ jobs
[1] Done sleep 10
$ jobs
$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.