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

C 多次执行fork会有什么风险?,c,linux,fork,C,Linux,Fork,我有一个程序可以按顺序多次执行fork(而不是同时执行) 这种行为的风险有多大 因为有时在多次执行fork之后,我会遇到fork错误,所以我非常清楚地描述了可能发生的情况: 如果出现以下情况,fork()函数将失败: [伊根] 系统缺乏创建另一进程所需的资源,或者系统对全系统或单个用户执行的进程总数施加的限制{CHILD_MAX}将被超过 如果出现以下情况,fork()函数可能会失败: [依诺曼] 可用存储空间不足 您可能会抗议您的子进程不是长时间运行的,并且不应该同时有太多的活动进程。在这种情

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

这种行为的风险有多大

因为有时在多次执行fork之后,我会遇到fork错误,所以我非常清楚地描述了可能发生的情况:

如果出现以下情况,fork()函数将失败:

[伊根] 系统缺乏创建另一进程所需的资源,或者系统对全系统或单个用户执行的进程总数施加的限制{CHILD_MAX}将被超过

如果出现以下情况,fork()函数可能会失败:

[依诺曼] 可用存储空间不足

您可能会抗议您的子进程不是长时间运行的,并且不应该同时有太多的活动进程。在这种情况下,问题可能是您的父进程正在离开“僵尸进程”(zombie process)——这些进程已终止,但由于未能在其子进程之后调用清理,仍然占用了进程表中的插槽。您可以同步调用
wait
,这意味着父进程除了等待子进程执行和终止之外没有什么更好的事情可做,或者您可以调用
wait
来响应SIGCHLD信号。令人愉快的是,
wait
waitpid
是,因此您可以从信号处理程序安全地调用它们,并且不影响程序的主流。

非常清楚地描述了可能发生的情况:

如果出现以下情况,fork()函数将失败:

[伊根] 系统缺乏创建另一进程所需的资源,或者系统对全系统或单个用户执行的进程总数施加的限制{CHILD_MAX}将被超过

如果出现以下情况,fork()函数可能会失败:

[依诺曼] 可用存储空间不足


您可能会抗议您的子进程不是长时间运行的,并且不应该同时有太多的活动进程。在这种情况下,问题可能是您的父进程正在离开“僵尸进程”(zombie process)——这些进程已终止,但由于未能在其子进程之后调用清理,仍然占用了进程表中的插槽。您可以同步调用
wait
,这意味着父进程除了等待子进程执行和终止之外没有什么更好的事情可做,或者您可以调用
wait
来响应SIGCHLD信号。令人愉快的是,
wait
waitpid
是,因此您可以从信号处理程序安全地调用它们,并且不影响程序的主流。

如果您有自己的UNIX/Linux系统,我建议您尝试一下

编译C程序:

int main(int argc, char *argv[]) {
    while(true) {
        int rc = fork();
        if(rc == -1) {
            perror("fork failed");
        }
    }
}
以普通用户的身份运行它。看看会发生什么

以root用户身份运行它。看着你的系统停下来。您可能需要重新启动以进行恢复


fork()
是一个系统调用,您的代码应该始终检查系统调用中的错误,因此您应该知道它失败的原因。这也适用于其他系统调用,例如
malloc()
fopen()

如果您有自己的UNIX/Linux系统,我建议尝试一下

编译C程序:

int main(int argc, char *argv[]) {
    while(true) {
        int rc = fork();
        if(rc == -1) {
            perror("fork failed");
        }
    }
}
以普通用户的身份运行它。看看会发生什么

以root用户身份运行它。看着你的系统停下来。您可能需要重新启动以进行恢复


fork()
是一个系统调用,您的代码应该始终检查系统调用中的错误,因此您应该知道它失败的原因。这也适用于其他系统调用,例如
malloc()
fopen()

fork
启动一个新进程。当您启动一个新流程数百万次时,会出现什么问题?例如,一个分叉炸弹:在失败后检查errno的值。您看到了什么错误?每个fork都使用resources,这是您唯一的限制。可能是,您也会在死锁中运行,这意味着某些资源将不再可用,因此您可能会遇到响应进程和/或内存泄漏。在Unix中,系统会限制创建的进程数,因此叉炸弹的风险会降低
fork
启动新进程。当您启动一个新流程数百万次时,会出现什么问题?例如,一个分叉炸弹:在失败后检查errno的值。您看到了什么错误?每个fork都使用resources,这是您唯一的限制。可能是,您也会在死锁中运行,这意味着某些资源将永远不再可用,因此您可能会遇到响应进程和/或内存泄漏。在Unix中,系统限制创建的进程数,从而降低了分叉炸弹的风险