我有以下代码:
#include <stdio.h>
main(int argc, char *argv[])
{
int n,st;
n = atoi(argv[1]);
while(n*fork()) {
printf("%d %d\n",getpid(), getppid());
n--;
printf("%d\n", wait(&st));
printf("------\n");
}
}
我执行此代码后得到以下结果:
bash-3.2$ ./test 3
10218 9948
10219
------
10218 9948
10220
------
10218 9948
10221
------
这是我的想法: 父母正在创建一个孩子:
10218 9948
但之后,我不明白为什么printf("%d\n", wait(&st));
会返回此ID: 10219 。
wait()
应该返回终止的子代码。
有人可以帮忙吗?!
答案 0 :(得分:5)
等待没有阻止,因为没有理由阻止。孩子已经完成了执行。这是因为Linux会安排“子”进程先运行。
以下是以图表形式发生的事情:
bash(9948)
|
| main(10218) child1(10219) child2(10220) child3(10221)
>-------------->
|
fork--------------->
|
while(0);
terminate;
|
print 10218 9948---<
wait (no block)
print 10219
|
fork----------------------------------->
|
while(0);
terminate;
|
print 10218 9948-----------------------<
wait (no block)
print 10220
|
fork----------------------------------------------------->
|
while(0);
terminate;
|
print 10218 9948-----------------------------------------<
wait (no block)
print 10221
terminate
|
---------------<
答案 1 :(得分:0)
fork
为子进程返回零,因此只有原始进程进入while循环;孩子们没有打印任何东西就退出了。
每次父进程打印其进程ID及其父进程id,然后打印子进程id作为wait的返回值。
在您的示例中,原始进程具有pid = 10218,并且它为处理ID为10219,10220,10221等的子女提供支持。
答案 2 :(得分:0)
这完全可以。
如果您对fork()创建的进程的PID感兴趣,则应该打印返回的值。
getpid将始终返回主进程的PID,并getppid其父进程(shell)。由于它们没有改变,因此无需在循环中打印它们。