叉子的流量,我有多少叉子?

时间:2016-10-23 21:11:05

标签: c fork ipc

我已执行此代码。 我知道消息的顺序是任何顺序(因为我明确没有使用信号量) 我的程序流程如何?为什么?

父母被执行所以“baz”被打印一次。有人可以解释为什么“条”不打印?为什么我得到“foo”(if语句为真)两次而不是一次或三次(不是我想要这个,但我想理解逻辑)(因为一位同事说我应该得到三次foo它)?

<div id="choose" style="width:240px; height:150px; margin-left:30px; margin-top:50px; background-color:#FF0; cursor: pointer; font-size:130px; text-align:center;" onclick="theFunction();">

3 个答案:

答案 0 :(得分:1)

pyversion version: '2.7' executable: 'C:\Python27\python.exe' library: 'C:\windows\system32\python27.dll' home: 'C:\Python27' isloaded: 0 没有返回,它用/ bin / echo替换整个过程映像。 因此,零&#34; bar&#34; s。

execl

有两个&#34; foo&#34; s。

    if (execl("/bin/echo", "/bin/echo", "foo", 0) == -1) {
      fork();
    }
    /* Not reached if execl succeeded.
    Because the exec family of functions replace the process image with
    another executable.  Flow will never return, unless there is an
    error. */
    printf("bar\n");

有一个&#34; baz&#34;。

  int p;
  p = fork();
  /* Two processes now */
  if (fork()==0) {
      /* Two child processes here. */
      execl("/bin/echo", "/bin/echo", "foo", 0); /* (Simplification) */
      /* Two (/bin/echo foo) here, flow will never return back */
  }

答案 1 :(得分:0)

首先,您需要了解系统调用的exec系列将其他程序替换为整个程序。在你的情况下,&#34; echo&#34;程序。超出execl电话的任何内容都不会被执行。

以下是发生的事情:

  1. 您的父进程(称为p 0 )执行p=fork(),它将分支克隆进程p 1
  2. 再次p 0 执行if(fork()== 0),分叉另一个克隆进程p 2
  3. p 0 然后执行打印&#34; baz&#34;的else语句的主体。

  4. 分叉后,p 1 执行if (fork()==0)语句,该语句分叉另一个进程p 3 。与p 0 一样,p 1 将进入else语句,但不会打印&#34; baz&#34;因为在{sub> 0 分叉时设置的p p 1 实际上等于0(因为p 1 是p的子项<子> 0 )。

  5. p 2 进入if语句体并执行execl函数,该函数用打印&#34; foo&#34;的程序替换当前程序。

  6. 与p 2 一样,p 3 进入if语句体并执行execl函数,该函数用打印&#的echo程序替换当前程序34; FOO&#34;

答案 2 :(得分:0)

第一个fork创建两个进程, 然后他们都做了第二次分叉。

p0    (p=$pid)              //first fork
                p1  (p==0)  

   p01                p11      //second fork
      exec              exec

在叶子(p01p11)中,第二个fork后跟exec,如果成功,则结束旧的过程图像。这应该会在foo上为您提供两个stdout

父母(p0p1)然后执行:

if (p!=0) execl("/bin/echo", "/bin/echo", "baz", 0);

p!=0测试只能在p0(原始流程)中成功。 这应该会在baz上为您提供一个stdout

(在实际代码中,您还应检查fork错误。)