【问题标题】:What are some conditions that may cause fork() or system() calls to fail on Linux?哪些情况可能会导致 Linux 上的 fork() 或 system() 调用失败?
【发布时间】:2010-10-25 14:53:25
【问题描述】:

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

例如:

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

【问题讨论】:

  • 澄清一下,当人们知道在 fork() 期间发生了诸如 EAGAIN 之类的错误时(errno == EAGAIN),您如何找出具体导致它的原因(是 RLIMIT_NPROC 吗?复制页表或任务结构时出错,如果是,为什么?你如何避免它?)
  • 我还问了一个关于 Linux 中页表的不同但相关的问题:stackoverflow.com/questions/853736/…

标签: linux process system fork


【解决方案1】:

如何才能知道它们中的任何一个是否正在发生?

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

来自 Linux 的手册页:

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

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

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

【讨论】:

  • 返回值为-1,errno变量设置为EAGAIN、ENOMEM等
  • @Chas。欧文斯 我就是这么说的。 “如果结果为 -1,请检查 errno 值”。
  • 啊,我把它解析为检查errno是否为-1,对不起。
  • 对不起,我的原始评论不清楚。我知道所有关于错误代码的信息(是的,我在发布到 stackoverflow 之前确实阅读了手册页!:),我正在寻找的是找出系统中导致这些错误的条件的方法。 (注意,一方面,fork() 设置 EAGAIN 的条件至少有两种。)
  • @Reed Hedges 我想您可以检查进程限制是否已用尽,并从中推断是否因为限制而设置了 EAGAIN。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2010-10-12
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多