我只需要理解这句话:
if (fork() && !fork())
不应该总是假的吗? 我的意思是,如果我写:
if (a && !a)
它总是假的,所以第一个也应该总是假的,我错了吗? 我当然是,但我希望有人可以向我解释这个奇怪的事情。
我正在攻读C考试,我必须解决这个问题:
int main(){ if(fork && !fork()){ printf("an"); } else printf("bn"); }
每次调用unix进程创建系统调用fork()都会返回两次。 首先,它将子节点的PID返回给父节点(调用fork()的进程)。 其次,它返回0给新创建的孩子。
来自手册页:
回报价值
成功时,子进程的PID将在父进程中返回,并在子进程中返回0。 失败时,在父项中返回-1,不创建子进程,并正确设置errno。
在你的情况下
if (fork() && !fork())
里面的语句if
,调用fork两次。 那么接下来会发生什么:
A |----------------B | | |---C | | | |
现在第一次调用fork()
将在A和B中返回。在A中它将是非零的,在B中它将为零。
对fork()的第二次调用将仅从A中引发,因为第一个fork返回0到B,它不会唤起第二个fork()
。 因为&&
短路评估是否发现第一个操作数非零。 感谢Daniel指出这一点。
所以我们可以制作一个表格:
PID fork()1 fork()2 ------------------------------ A >0 >0 B =0 >0 C >0 =0
因此,从图表中,Process C的if
将被评估为TRUE
重要的是要记住, fork()1
没有返回到C。 它从其父级获得了已经评估的表达式的副本。
我希望这能解释你的问题。
首先,是一个function。 它可能并不总是返回相同的值。
在这种情况下,fork是一个创建另一个进程的函数。 原始进程获得(孩子的pid)的正返回值,子进程的返回值为0。
在您的代码中,最终总共有三个进程。 对于其中一个,if语句将评估为true(下面的过程C)。
A |__________B | | |__C | | | | | | |
shouldn't be always false?
没有。
因为它不是变量,所以每次调用fork()
都会创建一个新的子进程。
每次调用fork()
返回两个值,每个进程一个。 因此,对于每个决策,都有一个流程采用每条路径。
fork()
函数调用将0返回到子进程,将进程ID返回给父进程。 基本上,它的作用就是一次。 如果进程是父进程,则跳转到下一个块,然后子进程再次分叉。 此进程的父级跳转到下一个块,此块中的子级执行if
语句中的代码。
以上就是c/c++开发分享C编程中的Fork()函数相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560449.html