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

时间:2009-05-12 16:42:57

标签: linux process system fork

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

例如:

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

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

/etc/security/limits.conf中的

nproc可以限制每个用户的进程数。

您可以通过检查fork的返回来检查失败。 0表示您在孩子中,正数是孩子的pid并且表示您在父母中,而负数表示分叉失败。当fork失败时,它设置外部变量errno。您可以使用errno.h中的函数来检查它。我通常只使用perror将错误(前面加上一些文本)打印到stderr。

#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;
}