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

Are Two Different Processes Trying to Execute Pipe Instruction segment?

这就是 xv6 中的 shell 处理 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;

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

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

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