我不知道子进程返回的值是怎么回事?
输出为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("%dn", val); return val; }
主要流程:
val = 5; wait(&val); // wait until child finishes
儿童过程:
val++; // val becomes 6 printf("%dn", val); // prints 6 return val; // return val back to main process
主要流程:
wait(&val); // val becomes 6 val++; // val becomes 7 printf("%dn", 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 ++;>每当进程在Linux中退出时,返回值都是临时存储的。 只要父进程没有获得此存储值,子进程仍然会列为zombie。 可以通过
wait
获取该值。 因此,无论何时在应用程序结束时使用return
,调用者中的wait()
都会为您提供此返回值。
以上输出是错误的。
主要流程:
val = 5; wait(&val); // wait until child finishes
儿童过程:
val++; // val becomes 6 printf("%dn", val); // prints 6 return val; // return val*256 back to main process
主要流程:
wait(&val); // val becomes 6 val++; // val becomes 1792+1=1793 printf("%dn", val); // prints 1793 return val;
如果在代码中添加一行,上面的输出是正确的!
Program 1: main() { val = 5; if(fork()) wait(&val);
val = val / 256 //如果你添加这一行,那么上面的输出是正确的
val++; printf("%dn", val); return val; }
这是由于
#define WEXITSTATUS(status) (((status)>>8) & 0xFF)
以上就是c/c++开发分享解释这段代码的工作原理; 子进程如何返回值以及在哪里?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562364.html