c/c++语言开发共享C编程中的Fork()函数

我只需要理解这句话:

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

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐