我不明白子进程如何返回值以及返回给谁?
输出为 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; 
}
    我不明白子进程如何返回值以及返回给谁?
输出为 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()。
Afork()基本上创建了一个新进程。这意味着将复制所有当前值。这也得出结论,val在您的父进程中不是val在您的子进程中。这就是您必须以某种方式与子进程进行通信的原因,您可以使用wait.
      父进程 | 子进程
---------------------------|---------- -----
主要() |
{ | #########################
    整数值 = 5;| // int val = parent.val;
** int tmp = fork(); | ** int tmp = 0;
    if(tmp) // 真 | if(tmp) // 假
        等待(&val); | // 不使用等待
        // 等到 | 验证++;// 值 = 6
        // 子进程 | printf("%d\n", val);
        // 返回。| 返回值;// 返回 6
        // 保存返回 | ###########|############
        // val 中的值 <---------------+
    验证++;// 值 = 7 | #########################
    printf("%d\n", val); | #########################
    返回值;| #########################
}
每当一个进程在 Linux 中退出时,返回值都是临时存储的。只要父进程没有得到这个存储值,子进程仍然被列为僵尸。该值可以通过 获取wait。所以每当你return <value>在你的应用程序结束时使用wait()你的调用者都会给你这个返回值。
Main process:
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 // if you add this line then the above output is correct
    val++; 
    printf("%d\n", val); 
    return val; 
}
it is due to
#define WEXITSTATUS(status) (((status)>>8) & 0xFF)