多次执行fork会有什么风险?

时间:2014-05-12 12:44:05

标签: c linux fork

我有一个程序可以按顺序执行fork(而不是同时执行)。

这种行为的风险可能是什么。

因为有时候执行fork多次后出现fork错误

2 个答案:

答案 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信号。很愉快,waitwaitpidasync-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()