int x=0; int main() { for(i=0;i<2;i++) { fork(); x=x+5; } return 0; }
我是fork()概念的新手。 上面的树(带有x值)是否是上述C代码的正确解决scheme? 节点中的值分别是其进程的x值。
而且我们也可以从subprocess返回父进程的值吗? 假设在上面的例子中,我可以返回subprocess的x值给父进程吗?
通过进程ID查找进程名称
linux内核代码“>>”运算符
Windows和Mac之间的CSS拼写差异的最佳解决scheme是什么?
杀-9和生产应用程序
Windows和Linux中的过程控制块(PCB)
为什么为结构中的多个数据成员添加填充而不是单个成员?
操作系统如何知道物理内存的真实大小?
如何在usb中创buildubuntu环境?
你的意思是这是一个进程树,在泡沫是x的价值? 那么不,那是不正确的。
当一个孩子产生后,它会得到一个父母的确切副本…所以让我们“打印”一些值,以便我们可以看到事物的状态(我正在为所有事情制定PID)
当我们开始时,它只是父母:
parent (11174) x = 0,i = 0
然后我们点击fork() ,现在我们有两个进程:
+--parent (11174) x = 0,i = 0 | +->child1 (11175) x = 0,i = 0
接下来的数学:
parent (11174) x = 5,i = 0 child1 (11175) x = 5,i = 0
当我们循环备份时,我们的i将被递增,并且每个进程现在运行循环并且命中fork() :
+--parent (11174) x = 5,i = 1 | +->child2 (11176) x = 5,i = 1 +--child1 (11175) x = 5,i = 1 | +->child (11177) x = 5,i = 1
现在每个人都再次敲打数学:
parent (11174) x = 10,i = 1 child2 (11176) x = 10,i = 1 child1 (11175) x = 10,i = 1 child (11177) x = 10,i = 1
最后,每个人都打循环,并增加i打破它。 所以你的最终结果是:
parent (10)----->child1(10)---->child(10) | +----->child2(10)
如果你调用fork()那么下面的代码是针对parent进程和child进程的。
fork创建一个新的进程(称为子进程),其地址空间与父进程不同。 所以,他们之间没有任何分享。
你正在循环调用fork,其实是2次,所以总共有4个独立的进程。
如果你想在子进程中做单独的编码,总是使用fork()的返回值,如下所示:
if(!fork()) { // child process } else { // parent process }
对于这个问题:
And also can we return values to the parent process from the child process? Suppose lets say in the above example code can I return the x value of the child to the parent process?
答案是,你不能直接从一个进程返回一个值到另一个进程。 2个或更多进程之间的通信是使用“进程间通信”(IPC)这一概念实现的,您可以通过两种方式完成。
1. shared memory 2. memssage passing (pipe,rpc)
在解决这个问题之前,还有很多事情你需要了解。 特别是当你正在尝试使用fork来实现时,还想返回值
你应该看到这个
或者,这可能会帮助你更多
创建一个子进程并将父进程的所有变量复制到子变量中。
家长:
你的主程序创建2个孩子,正如你在For-Loop中所提到的那样,当它创建child1 ,值为i是0当它创建child2 ,值是i
Child1:
Child1在fork(), i++执行后,在下一次迭代( i = 1 ) – condition true( 1 < 2 )时开始执行, child3分叉另一个child3孩子, child3的值为1 。
Child2和Child3:
在fork(), i++执行之后, Child2和Child3以i = 1开始执行,现在i变成了2 ,条件为false,没有创建更多的子Child3 。
在Total中创建了3流程。
码:
int x=0; int main() { for(i=0;i<2;i++) { fork(); x=x+5; } printf("x = %dn",x); return 0; }
OUTPUT:
x = 10 x = 10 x = 10 x = 10
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。