Вот как xv6 обрабатывает команду PIPE (из исходного кода xv6).</p>
<pre><code>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, после вызова fork1 () в строке 8661 будет запущено всего 4 процесса.С самого начала скажем, что родительский процесс - это P. После fork1 () строки 8654, есть 2 процесса, P и вновь созданный C1.Оба они выполняют строку 8661. Итак, создано еще 2 новых процесса.С2 из Р и С3 из С1.
Но для правильной работы PIPE только C3 должен выполнить строку 8662 - 8666. Процесс C2 не выполнит их?Поскольку C2 является дочерним процессом, я думаю, что это так.Если это так, это правильно?