C并发进程

时间:2016-02-10 20:00:13

标签: c fork sleep

我试图做一个简单的测试,看看这些进程是否同时运行。

这是我到目前为止所做的:

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 created\n", pid);
    }
    else
    {
         exit(0);
    }
}

printf("Main Process\n");

for (i=0; i < argc - 1; i++)
{
     int status;
     wait(pids[i], &status, 0);
     printf("Process %d finished\n", pids[i]);
}

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

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

另外,为什么&#34;主要流程&#34;只印一次?在完成for循环后,每个进程都不会继续执行直到返回语句吗?我对此感到困惑。

非常感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:1)

子进程将每次返回0到fork。这意味着他们将执行else块的if部分,即exit。换句话说,每个客户端进程几乎在它启动时立即退出。孩子们不会打印“主要流程”,因为他们在到达之前会exit

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

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

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

编辑:

我会更准确地解释发生了什么:

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

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

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

答案 1 :(得分:0)

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

但是,如果进程存活了一段时间,您可以使用基本的“ps”命令发现它们,可以确保进程正在运行:

   ps

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

   ps jf