C 在本例中,fork()的行为不清楚
之后,我必须按enter键才能进入提示C 在本例中,fork()的行为不清楚,c,unix,C,Unix,之后,我必须按enter键才能进入提示 为什么案例0在案例为默认情况下工作。另外,命令提示如何第二次自动出现并执行案例0?那么为什么在最后一次出现默认值呢?您在case 0中缺少了一个中断这与fork关系不大,而与switch语句关系很大 您的子进程从fork返回0返回代码,因此它进入案例0。不幸的是,由于在案例0的末尾没有break语句,因此它会一直延续到default。这是因为一个案例结束时的默认行为是,如果有下一个案例的话,就直接进入下一个案例 这与: root@heena:/home/h
为什么案例0在案例为默认情况下工作。另外,命令提示如何第二次自动出现并执行案例0?那么为什么在最后一次出现默认值呢?您在case 0中缺少了一个中断这与
fork
关系不大,而与switch
语句关系很大
您的子进程从fork
返回0
返回代码,因此它进入案例0
。不幸的是,由于在案例0
的末尾没有break
语句,因此它会一直延续到default
。这是因为一个案例结束时的默认行为是,如果有下一个案例的话,就直接进入下一个案例
这与:
root@heena:/home/heena/fork# ./a.out
default case: pid returned by fork is 4640
root@heena:/home/heena/fork# This is the child process mention in case 0 of switch!, but why case 0 reached?
default case: pid returned by fork is 0
最终会产生看似精神病的输出:
int i = 1;
switch (i) {
case 1: puts ("It was one");
case 2: puts ("It was two");
case 3: puts ("It was three");
default: puts ("It was something else");
}
要修复它(您的代码,而不是上面的示例),请使用:
您被输出弄糊涂了:
对于父进程,它转到default
并打印pid,然后在不等待子进程完成时退出。您将看到命令提示符。
你可以看到:
root@heena:/home/heena/fork#/a.out
默认情况:fork返回的pid为4640
root@heena:/home/heena/fork#
对于子进程,case 0
被执行,并打印该行,然后由于在这个case之后没有break
语句,它转到默认case,并打印这个(即子)进程的pid为0,然后退出。
因此您看到:
这是在开关的情况0中提到的子进程!,但为什么是案例0
达到?
默认情况:fork返回的pid为0
只需插入break代码>在案例0:
之后,您将清楚地看到输出。那么fork()
的用途是什么?当我们如上所述进行fork时,两个进程将并行运行?break语句在哪里?是是的,进程将并行运行。通常,在退出父进程之前,等待子进程完成是一种习惯。
int i = 1;
switch (i) {
case 1: puts ("It was one");
case 2: puts ("It was two");
case 3: puts ("It was three");
default: puts ("It was something else");
}
It was one
It was two
It was three
It was something else
switch (pid =fork()) {
case -1:
perror ("fork");
exit (1); // will exit rather than fall through.
case 0:
printf (" This is the child process\n");
break; // will end switch rather than fall through.
default:
printf ("default case: pid returned by fork is %d\n",pid );
// nothing needed here since switch is ending anyway.
}