簡體   English   中英

waitpid() function 返回 ERROR (-1),為什么?

[英]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錯誤,但再次失敗。

我的問題是:

  1. 為什么你認為這種行為會發生
  2. 如果您有解決方案(理想的做法是讓它繼續返回 DONE)
  3. 如果您對如何實現作業/歷史命令有更好的了解,則可以接受

這個問題的一個解決方案是,一旦我得到“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.

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