有什么条件可能导致fork()或system()调用在Linux上失败?

Ree*_*ges 6 linux fork system process

如何判断是否有任何一个出现,并导致fork()或system()返回错误?换句话说,如果fork()或system()返回错误,我可以检查Linux中的哪些东西来诊断为什么会发生特定错误?

例如:

  • 只是内存不足(导致errno ENOMEM) - 使用'free'等检查内存使用情况.
  • 内核没有足够的内存来复制页面表和父进程的其他记帐信息(结果为errno EAGAIN)
  • 是否存在全局流程限制?(导致errno EAGAIN也?)
  • 是否存在每用户进程限制?我该怎么知道它是什么?
  • ...?

lot*_*har 6

怎么能弄清楚它们中是否有任何一个出现?

如果结果(返回值)为-1,请检查errno

从Linux上的手册页:

返回值
成功时,父进程返回子进程的PID,并在子进程中返回0.失败时,在父项中返回-1,不创建子进程,并正确设置errno.

错误
EAGAIN
fork()无法分配足够的内存来复制父页面表并为子项分配任务结构.
EAGAIN
由于遇到调用者的RLIMIT_NPROC资源限制,因此无法创建新进程.要超过此限制,进程必须具有CAP_SYS_ADMIN或CAP_SYS_RESOURCE功能. 由于内存紧张,
ENOMEM
fork()无法分配必要的内核结构.

符合SVr4,4.3BSD,POSIX.1-2001.