我试图做一个简单的测试,看看这些进程是否同时运行。
这是我到目前为止所做的:
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循环后,每个进程都不会继续执行直到返回语句吗?我对此感到困惑。
非常感谢任何帮助。
感谢。
答案 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