是否有两个不同的进程试图执行管道指令段?

时间:2018-12-30 18:24:09

标签: pipe fork xv6

这是xv6处理 PIPE 命令的方式(来自xv6-源代码)。

8650 case PIPE:
8651     pcmd = (struct pipecmd*)cmd;
8652     if(pipe(p) < 0)
8653         panic("pipe");
8654     if(fork1() == 0){
8655         close(1);
8656         dup(p[1]);
8657         close(p[0]);
8658         close(p[1]);
8659         runcmd(pcmd−>left);
8660     }
8661     if(fork1() == 0){
8662         close(0);
8663         dup(p[0]);
8664         close(p[0]);
8665         close(p[1]);
8666         runcmd(pcmd−>right);
8667     }
8668     close(p[0]);
8669     close(p[1]);
8670     wait();
8671     wait();
8672 break;

8650 case PIPE: 8651 pcmd = (struct pipecmd*)cmd; 8652 if(pipe(p) < 0) 8653 panic("pipe"); 8654 if(fork1() == 0){ 8655 close(1); 8656 dup(p[1]); 8657 close(p[0]); 8658 close(p[1]); 8659 runcmd(pcmd−>left); 8660 } 8661 if(fork1() == 0){ 8662 close(0); 8663 dup(p[0]); 8664 close(p[0]); 8665 close(p[1]); 8666 runcmd(pcmd−>right); 8667 } 8668 close(p[0]); 8669 close(p[1]); 8670 wait(); 8671 wait(); 8672 break;

据我对Fork的了解,在8661行中的fork1()调用之后,将总共运行4个进程。从一开始就说母进程是P。在8654行的fork1()之后,有2个进程,即P和新创建的C1。他们两个都执行8661行。因此,又创建了2个新进程。 P中的C2和C1中的C3。

但是,为了使PIPE正常工作,只有C3应该执行8662-8666行。进程C2是否将不执行它们?由于C2是子进程,因此我认为确实如此。如果是,那是正确的吗?

1 个答案:

答案 0 :(得分:1)

runcmd永远不会返回,因此进程C1永远不会到达8661行,C2永远不会到达8668行,并且C3不存在。