如何在c中解决这个fork()例子

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 ,值为i0当它创建child2 ,值是i

Child1:

Child1在fork(), i++执行后,在下一次迭代( i = 1 ) – condition true( 1 < 2 )时开始执行, child3分叉另一个child3孩子, child3的值为1

Child2和Child3:

在fork(), i++执行之后, Child2Child3i = 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