我不明白子进程如何返回值以及返回给谁?
输出为 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)