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
值给父进程吗?
你的意思是这是一个进程树,在泡沫是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
来实现时,还想返回值
你应该看到这个
或者,这可能会帮助你更多
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 = %d\n", x); return 0; }
OUTPUT:
x = 10 x = 10 x = 10 x = 10