C
分叉:負返回值
從 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
可能由於缺乏可用資源而失敗(可能是人為限制的形式,而不是簡單的記憶體不足)。
fork
POSIX 未指定shell 失敗時的行為。實際上,它們傾向於返回不同的錯誤狀態(pdksh 中為 1,ash 中為 2,bash 中為 254,ksh93 中為 258,tcsh 中為 1;zsh 返回 0,這是一個錯誤)。如果您正在實現一個用於生產用途的 shell(而不是學習練習),那麼可能值得在Austin Group郵件列表上討論這個問題。