C 并发进程



我正在尝试做一个简单的测试,看看进程是否同时运行。

这是我到目前为止所拥有的:

pid_t pids[argc-1];
pid_t pid;
for(i=1; i<argc; i++)
{
    pid = fork();
    if (pid > 0)
    {
         pids[i-1] = pid;
         printf("process %d createdn", pid);
    }
    else
    {
         exit(0);
    }
}
printf("Main Processn");
for (i=0; i < argc - 1; i++)
{
     int status;
     wait(pids[i], &status, 0);
     printf("Process %d finishedn", pids[i]);
}

在这种情况下,我的 argc = 4,所以这创建了 3 个子进程,这正是我所需要的。

我的问题是我如何确保所有进程同时运行?我尝试调用睡眠,但这没有帮助,因为这些进程是按顺序创建的,每个睡眠都会使它们一次睡一个。我想将第二个子进程设置为 sleep(1(,只是为了看看其他两个进程是否会在休眠时打印一些东西,但我不能在 for 循环中这样做。

另外,为什么"主进程"只打印一次?难道每个进程一旦使用 for 循环完成,就会继续执行直到返回语句吗?我对此感到困惑。

任何帮助将不胜感激。

谢谢。

子进程将分别返回 0 到 fork 。 这意味着他们将执行if块的else部分,即exit。 换句话说,每个客户端进程几乎在启动后立即退出。 孩子们不打印"主进程",因为他们在到达那里之前就exit了。

如果您希望子进程休眠,请在代码的子部分(即else块(中调用 sleep 函数。

例如,您可以执行以下操作:

...
else
{
     printf("in child %dn", getpid());
     sleep(1);
     printf("in child %dn", getpid());
     sleep(3);
     exit(0);
}

编辑:

我将更详细地解释到底发生了什么:

for循环的第一次迭代中,原始进程调用fork 。 此函数返回两次:一次返回父函数,返回子项的 pid,一次返回子项,返回 0。

父级进入if块,在那里它更新其 pid 列表并返回到循环的顶部。 子进程转到else部分,在该部分中调用exit结束子进程。

原来的父进程现在再次成为for循环的顶部,上面又重复了 3 次。

正如 M. Averbach 所说,您发布的代码会退出得如此之快,以至于很难发现它们。但是要解决有关如何检查进程是否正在运行的问题:

但是,如果进程存活的时间更长,您可以使用基本的"ps"命令来发现它们,以确保您的进程正在运行:

附言

如果您的子进程可能有自己的子进程,那么使用以树格式显示的表单可能会有所帮助:

PS JF

最新更新