我有一个程序可以按顺序执行fork(而不是同时执行)。
这种行为的风险可能是什么。
因为有时候执行fork多次后出现fork错误
答案 0 :(得分:3)
The Open Group Base Specifications Issue 7, IEEE Std 1003.1, 2013 Edition,非常清楚地描述了可能发生的事情:
如果符合以下情况,fork()函数将失败:
[EAGAIN] 系统缺少创建另一个流程所需的资源,或者系统对系统范围内执行的流程总数或单个用户{CHILD_MAX}的限制将被超出。
如果出现以下情况,fork()函数可能会失败:
[ENOMEM] 存储空间不足。
您可能会抗议您的子进程没有长时间运行,并且不应该一次激活太多。在这种情况下,问题可能是您的父进程正在离开“僵尸进程” - 已经终止但仍占用进程表中的插槽 - 由于未能在其子进程之后调用wait
进行清理。您可以同步调用wait
,因为父进程没有比等待子进程执行和终止更好的意义,或者您可以调用wait
来响应SIGCHLD信号。很愉快,wait
和waitpid
是async-signal-safe,因此您可以安全地从信号处理程序中调用它们,并使程序的主流不受影响。
答案 1 :(得分:1)
如果您有自己的UNIX / Linux系统,我建议您尝试使用它。
编译C程序:
int main(int argc, char *argv[]) {
while(true) {
int rc = fork();
if(rc == -1) {
perror("fork failed");
}
}
}
以普通用户身份运行。看看会发生什么。
以root身份运行它。看着你的系统停止运转。您可能希望重新启动以恢复。
fork()
是一个系统调用,您的代码应该始终检查系统调用中的错误,因此您应该获得有关失败原因的信息。这适用于其他系统调用,例如malloc()
或fopen()
。