Два разных процесса пытаются выполнить секцию инструкции по трубе? - PullRequest
0 голосов
/ 30 декабря 2018

Вот как 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 является дочерним процессом, я думаю, что это так.Если это так, это правильно?

1 Ответ

0 голосов
/ 31 декабря 2018

runcmd никогда не возвращается, поэтому процесс C1 никогда не попадает в строку 8661, C2 никогда не попадает в строку 8668, а C3 не существует.

...