C wait()函数的行为
我有以下代码:C wait()函数的行为,c,wait,C,Wait,我有以下代码: #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");
#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");
}
}
以下是我的想法:
父项正在创建子项:
10218 9948
但是之后,我不明白为什么printf(“%d\n”,wait(&st))代码>返回此id:10219
wait()
有人能帮忙吗 fork
对子进程返回零,因此只有原始进程进入while循环;孩子们没有打印任何东西就离开了
每次父进程打印其进程id和父进程id,然后打印子进程id作为wait的返回值时
在您的示例中,原始进程的pid=10218,它用进程ID 10219、10220、10221等派生子进程。fork
为子进程返回零,因此只有原始进程进入while循环;孩子们没有打印任何东西就离开了
每次父进程打印其进程id和父进程id,然后打印子进程id作为wait的返回值时
在您的示例中,原始进程的pid=10218,它用进程ID 10219、10220、10221等派生子进程。这完全可以
如果您对fork()创建的进程的PID感兴趣,应该打印返回值
getpid将始终返回主进程的PID,并返回其父进程(shell)的getppid。因为它们不会改变,所以在循环中打印它们是没有意义的。这很好
如果您对fork()创建的进程的PID感兴趣,应该打印返回值
getpid将始终返回主进程的PID,并返回其父进程(shell)的getppid。因为它们没有改变,所以在循环中打印它们是没有意义的。等待没有阻塞,因为没有阻塞的理由。子项已完成执行。这是因为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
|
---------------<
bash(9948)
|
|主要(10218)儿童1(10219)儿童2(10220)儿童3(10221)
>-------------->
|
叉子----------------->
|
而(0);
终止
|
打印102189948---<
等待(无阻塞)
打印10219
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------<
等待(无阻塞)
打印10220
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------------------------<
等待(无阻塞)
打印10221
终止
|
---------------<
等待未被阻止,因为没有阻止的理由。子项已完成执行。这是因为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
|
---------------<
bash(9948)
|
|主要(10218)儿童1(10219)儿童2(10220)儿童3(10221)
>-------------->
|
叉子----------------->
|
而(0);
终止
|
打印102189948---<
等待(无阻塞)
打印10219
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------<
等待(无阻塞)
打印10220
|
叉子------------------------------------------>
|
而(0);
终止
|
打印102189948-----------------------------------------<
等待(无阻塞)
打印10221
终止
|
---------------<
原始进程的进程id是10218,子进程的进程id是10219、10220、10221等。有什么问题吗?9948是您的shell的PID。原始进程的进程id是10218,子进程的进程id是10219、10220、10221等。有什么问题吗?9948是您的shell的PID。@Elia没有问题。如果您认为正确答案有帮助,请随意标记:-)@Elias没问题。如果您觉得有帮助,请随时标记为正确答案:-)