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

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

例如:

  • 只是内存不足(导致errno ENOMEM) – 检查内存使用“免费”等
  • 内核没有足够的内存来复制父进程的页表和其他会计信息(导致errno EAGAIN)
  • 是否有全球stream程限制? (导致errno EAGAIN呢?)
  • 是否有每个用户的进程限制? 我怎么知道它是什么?
  • …?

怎么能找出他们中的任何一个是否发生?

如果结果(返回值)是-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。

/etc/security/limits.conf中的nproc可以限制每个用户的进程数量。

您可以通过检查分叉返回来检查失败。 0意味着你在孩子身上,正数是孩子的PID,意味着你在父母身上,负数表示分叉失败。 当fork失败时,它设置外部变量errno。 你可以使用errno.h中的函数来检查它。 我通常只是使用perror打印错误(与一些文本预先)到标准错误。

#include <stdio.h> #include <errno.h> #include <unistd.h> int main(int argc, char** argv) { pid_t pid; pid = fork(); if (pid == -1) { perror("Could not fork: "); return 1; } else if (pid == 0) { printf("in child\n"); return 0; }; printf("in parent, child is %d\n", pid); return 0; }