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检查的进程.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...