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

c – 如果进退两难,请进行内部分叉

如果我打电话会怎么样

if (fork() == fork())
   //do something

在这种情况下,父母和两个孩子都会参与陈述或程序是什么?

解决方法

有两个叉子,你最终会得到四个过程:一个父母,两个孩子和一个孙子.

由于C不要求从左到右计算表达式,因此未定义两个叉子发生的顺序.最后,首先发生的事情并不重要,所以让我们先假装左叉()发生.当发生这种情况时,你最终会得到一个父母和一个孩子.父母将获得孩子的PID,孩子将获得0.

让我们调用父A和子B.这是左叉执行后这两个进程的样子:

A          if (<pidof B> == fork())
|
+--B       if (0 == fork())

现在他们每个人都会执行正确的分叉.两个过程变为四个.让我们调用B的新子C和A的新子D.再次,每个fork()调用将返回两个值中的一个:父进程中的新子PID,或子进程中的0.以下是我们的四个流程将成为什么:

A          if (<pidof B> == <pidof D>)
|
+--B       if (0 == <pidof C>)
|  |
|  +--C    if (0 == 0)
|
+--D       if (<pidof B> == 0)

碰巧,进程C将是唯一通过if检查的进程.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐