来自 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 调用失败的原因。 fork返回-1的情况有哪些?
我正在用 C 语言编写标准 Unix shell。我应该如何处理该错误?
答案1
在 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(而不是学习练习),那么可能值得在奥斯汀集团邮件列表。
答案2
我知道内核有一个参数NPROC
告诉它可以同时运行的最大进程数。我想如果你已经达到最大值并尝试创建另一个,你将被内核拒绝并向你的父级返回 -1 。
另一方面,内核还在参数中存储了每个用户的进程限制MAXUPRC
。与上述相同的优惠适用。
答案3
一个可能的原因是由于配额限制或某些系统故障而无法生成新进程。
在编写软件时,您可能并不总是知道为什么某些事情可能会失败,但是如果有一个明确定义的方法来处理不正确的每一步总是一个好主意。