从 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.
Run Code Online (Sandbox Code Playgroud)
我想知道导致 fork 调用失败的原因。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邮件列表上讨论这个问题可能是值得的。