这是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是子进程,因此我认为确实如此。如果是,那是正确的吗?
答案 0 :(得分:1)
runcmd
永远不会返回,因此进程C1永远不会到达8661行,C2永远不会到达8668行,并且C3不存在。