C

分叉:負返回值

  • August 21, 2011

從 fork(2) 手冊頁:

RETURN VALUE
  On success, the PID of the child process is returned in the parent, and
  0 is returned in the child.  On failure, -1 is returned in the  parent,
  no child process is created, and errno is set appropriately.

我想知道導致分叉呼叫失敗的原因。fork 返回-1的情況有哪些?

我正在用 C 編寫標準的 Unix shell。我應該如何處理錯誤?

在 C API 中,系統呼叫返回負值表示錯誤,並且錯誤程式碼中的錯誤程式碼errno提供了有關錯誤性質的更多資訊。您的手冊頁應該解釋系統上可能出現的錯誤。有兩個標準錯誤程式碼:

  • EAGAIN表示由於缺乏可用資源(某種記憶體不足或已達到限制,例如每個使用者或整體的最大程序數)而無法創建新程序。
  • ENOMEM表示由於某種記憶體不足而無法創建新程序。在 Linux 下,ENOMEM表示缺少核心記憶體,而缺少使用者空間記憶體則報告為EAGAIN. 在 OpenBSD 下,ENOMEM也用於缺少使用者空間記憶體。

總之,fork可能由於缺乏可用資源而失敗(可能是人為限制的形式,而不是簡單的記憶體不足)。

forkPOSIX 未指定shell 失敗時的行為。實際上,它們傾向於返回不同的錯誤狀態(pdksh 中為 1,ash 中為 2,bash 中為 254,ksh93 中為 258,tcsh 中為 1;zsh 返回 0,這是一個錯誤)。如果您正在實現一個用於生產用途的 shell(而不是學習練習),那麼可能值得在Austin Group郵件列表上討論這個問題。

引用自:https://unix.stackexchange.com/questions/19113