解释这段代码的工作原理; 子进程如何返回值以及在哪里?

我不知道子进程返回的值是怎么回事?

输出为6,7; 问题来源: http : //www.cs.utexas.edu/~mwalfish/classes/s11-cs372h/hw/sol1.html

Program 1: main() { val = 5; if(fork()) wait(&val); val++; printf("%d\n", val); return val; } 

主要流程:

 val = 5; wait(&val); // wait until child finishes 

儿童过程:

 val++; // val becomes 6 printf("%d\n", val); // prints 6 return val; // return val back to main process 

主要流程:

 wait(&val); // val becomes 6 val++; // val becomes 7 printf("%d\n", val); // prints 7 return val; 
 if(fork()) 

创建子进程。 每个进程都获得var的副本。 fork在父进程中返回非零值。 所以if只为父进程执行。 和wait仅被调用父进程。 它等待子进程完成执行。

子进程增量val打印并返回。 一旦它返回父进程恢复并通过递增var进一步执行,打印其值,然后从main()返回它。

fork()基本上创建了一个新进程。 这意味着将复制所有当前值。 这也得出结论,父进程中的val不是子进程中的val 。 这就是你必须以某种方式与子进程进行通信的原因,你可以通过使用wait

 父进程| 儿童过程
 --------------------------- | ---------------------- -----
 main()|
 {|  #########################
     int val = 5;  |  // int val = parent.val;
 ** int tmp = fork();  |  ** int tmp = 0;
     if(tmp)// true |  if(tmp)// false
        等待(VAL);  |  //不使用等待
         //等到|  VAL ++;  // val = 6
         //子进程|  printf(“%d \ n”,val); 
         //返回。  | 返回;  //返回6
         //保存返回|  ########### | ############
         // val中的值<--------------- +
     VAL ++;  // val = 7 |  #########################
     printf(“%d \ n”,val);  |  #########################
    返回;  |  #########################
 } 

每当进程在Linux中退出时,返回值都是临时存储的。 只要父进程没有获得此存储值,子进程仍然会列为zombie。 可以通过wait获取该值。 因此,无论何时在应用程序结束时使用return ,调用者中的wait()都会为您提供此返回值。

以上输出是错误的。

主要流程:


 val = 5; wait(&val); // wait until child finishes 

儿童过程:

 val++; // val becomes 6 printf("%d\n", val); // prints 6 return val; // return val*256 back to main process 

主要流程:

 wait(&val); // val becomes 6 val++; // val becomes 1792+1=1793 printf("%d\n", val); // prints 1793 return val; 

如果在代码中添加一行,上面的输出是正确的!

 Program 1: main() { val = 5; if(fork()) wait(&val); 

val = val / 256 //如果你添加这一行,那么上面的输出是正确的

  val++; printf("%d\n", val); return val; } 

这是由于

 #define WEXITSTATUS(status) (((status)>>8) & 0xFF)