在Linux上,什么情况可能导致fork()或system()调用失败?

在Linux上,什么情况可能导致fork()或system()调用失败?,linux,process,system,fork,Linux,Process,System,Fork,我们如何才能知道它们是否正在发生,并导致fork()或system()返回的错误?换句话说,如果fork()或system()返回一个错误,我可以检查Linux中的哪些东西来诊断为什么会发生这个错误 例如: 只是内存不足(导致errno ENOMEM)-使用“free”等检查内存使用情况 内存不足,内核无法复制父进程的页表和其他记帐信息(导致errno EAGAIN) 是否存在全局流程限制?(也会导致errno EAGAIN?) 是否有每个用户的进程限制?我怎样才能知道它是什么 我们如何才

我们如何才能知道它们是否正在发生,并导致fork()或system()返回的错误?换句话说,如果fork()或system()返回一个错误,我可以检查Linux中的哪些东西来诊断为什么会发生这个错误

例如:

  • 只是内存不足(导致errno ENOMEM)-使用“free”等检查内存使用情况
  • 内存不足,内核无法复制父进程的页表和其他记帐信息(导致errno EAGAIN)
  • 是否存在全局流程限制?(也会导致errno EAGAIN?)
  • 是否有每个用户的进程限制?我怎样才能知道它是什么
我们如何才能知道这些事件是否正在发生

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

从Linux上的手册页:

返回值
成功时,子进程的PID在父进程中返回,0在子进程中返回。失败时,在父进程中返回-1,不创建子进程,并且错误号设置正确

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

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


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

您可以通过检查fork的返回来检查失败。0表示您在子系统中,正数表示子系统的pid,表示您在父系统中,负数表示fork失败。当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;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
pid_t pid;
pid=fork();
如果(pid==-1){
佩罗尔(“无法分叉:”);
返回1;
}否则如果(pid==0){
printf(“子项中的\n”);
返回0;
};
printf(“在父级中,子级为%d\n”,pid);
返回0;
}

返回值为-1,errno变量设置为EAGAIN、ENOMEM等@Chas。欧文斯,我就是这么说的。“如果结果为-1,则检查errno值”。啊,我将其解析为检查errno for-1,对不起。对不起,我在最初的评论中不清楚。我知道所有的错误代码(是的,我在发布到stackoverflow!之前阅读了手册页),我要寻找的是找出导致这些错误的系统条件的方法。(请注意,fork()设置EAGAIN至少有两种情况。)@Reed Hedges我想您可以检查流程限制是否已用尽,并由此推断EAGAIN是否是因为限制而设置的。为了澄清,当您知道在fork()期间发生了类似EAGAIN的错误时(errno==EAGAIN),如何找出具体的原因(是RLIMIT_NPROC吗?是复制页表或任务scructure时出错吗?如果是,原因是什么?如何避免?)我还问了一个关于Linux中页表的不同但相关的问题: