微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在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值给父进程吗?

通过进程ID查找进程名称

linux内核代码“>>”运算符

系统调用硬件性能计数器ubuntu

在C程序中获取系统命令输出

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来实现时,还想返回值

你应该看到这个

或者,这可能会帮助你更多

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] 举报,一经查实,本站将立刻删除。

相关推荐