是否有两个不同的进程试图执行管道指令段?
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 不存在。
这就是 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 不存在。