【问题标题】:maximum concurrent processes active on a system at a time with fork()使用 fork() 一次在系统上活动的最大并发进程
【发布时间】:2015-01-24 10:30:16
【问题描述】:

此程序用于创建最大编号。进程系统允许创建

好的,但我没有得到其他部分是什么

当我执行它时,我的系统会自动挂起启动??

有人可以解释一下下面的代码是如何工作的吗??

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    pid_t pid;
    int i = 1;

    for(;;)
    {
        pid = fork();
        if(pid < 0)
            printf("MAX no of concurrent process are %d\n",i);

        if(pid == 0)
            i++;
        else
        {
            wait(0);
            exit(0);
        }
    }

    return 0;
}

【问题讨论】:

  • else 部分只会在父进程上运行。因此,它等待()它的孩子退出。
  • 是的,但是 wait() 语句之后的 exit() 呢?
  • 应该是if(pid&lt;0) { printf("..."); exit(0); }
  • 我看到的问题是发布的代码使用了所有可用的进程,然后在fork 失败后,它在没有子进程的进程上调用wait(0)。所以我预计wait 永远不会返回,系统会因为无法创建更多进程而崩溃。
  • 是的,在您的系统上运行 fork bomb 是确定进程限制的不好方法。即使按照我建议的更改,您的系统仍有可能在显示printf 之前崩溃。有更好的方法来确定进程限制。例如,请参阅 this discussion。

标签: c fork


【解决方案1】:

进入for 循环时,会尝试对进程进行分叉。

成功时,在父进程中,fork() 返回一些东西 &gt; 0,即子进程的 PID。孩子返回0。

失败时,fork() 返回&lt; 0。这种情况应该得到妥善处理。

在您的代码中,子进程递增“继承的”i 并继续下一个循环运行,但父进程等待其子进程并退出。

这一切都顺利到fork() 失败的地步。然后你得到一个输出,但代码仍然继续,直到wait(0)。它挂在那里,它的所有父母也挂在那里。

如果你愿意

if(pid < 0) {
    printf("MAX no of concurrent process are %d\n",i);
    exit(0); // or return 0
}

无法创建另一个孩子的孩子将正常退出,其所有父母也会这样做。

【讨论】:

  • if(pid
猜你喜欢
  • 2016-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-13
  • 2014-08-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多