7

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

例如:

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

2 回答 2

7

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

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

于 2009-05-12T16:46:06.707 回答
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;
}
于 2009-05-12T16:54:27.487 回答