Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在本例中,fork()的行为不清楚_C_Unix - Fatal编程技术网

C 在本例中,fork()的行为不清楚

C 在本例中,fork()的行为不清楚,c,unix,C,Unix,之后,我必须按enter键才能进入提示 为什么案例0在案例为默认情况下工作。另外,命令提示如何第二次自动出现并执行案例0?那么为什么在最后一次出现默认值呢?您在case 0中缺少了一个中断这与fork关系不大,而与switch语句关系很大 您的子进程从fork返回0返回代码,因此它进入案例0。不幸的是,由于在案例0的末尾没有break语句,因此它会一直延续到default。这是因为一个案例结束时的默认行为是,如果有下一个案例的话,就直接进入下一个案例 这与: root@heena:/home/h

之后,我必须按enter键才能进入提示


为什么案例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.
 }