如何判断是否有任何一个出现,并导致fork()或system()返回错误?换句话说,如果fork()或system()返回错误,那么我可以检查Linux中的哪些东西来诊断为什么会发生特定错误?
例如:
答案 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)
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;
}