代码之家  ›  专栏  ›  技术社区  ›  Reed Hedges

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

  •  6
  • Reed Hedges  · 技术社区  · 15 年前

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

    例如:

    • 只是内存不足(导致errno ENOMEM)-使用“free”等检查内存使用情况。
    • 内存不足,内核无法复制父进程的页表和其他记帐信息(导致errno EAGAIN)
    • 是否有全球流程限制?(也会导致errno EAGAIN?)
    • 是否有每个用户的进程限制?我怎样才能知道它是什么?
    • ...?
    2 回复  |  直到 15 年前
        1
  •  7
  •   lothar    15 年前

    那么,我们如何才能知道其中是否有任何一个正在发生?

    检查 错误号 如果结果(返回值)为-1,则返回值

    从Linux上的手册页:

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

    错误
    伊根
    fork()无法分配足够的内存来复制父级的页表并为子级分配任务结构。
    伊根
    无法创建新进程,因为遇到了调用方的RLIMIT\u NPROC资源限制。要超过此限制,进程必须具有CAP\u SYS\u ADMIN或CAP\u SYS\u资源功能。
    依诺门姆
    fork()无法分配必要的内核结构,因为内存紧张。

    符合 SVr4、4.3BSD、POSIX。1-2001.

        2
  •  1
  •   Chas. Owens    15 年前

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

    您可以通过检查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;
    }