2013-03-03 3 views
2

Скажем, к примеру, мы имеем следующие выполненный в корпусе:Как выглядит дерево процессов с помощью вилки()?

ls | grep "abc" | wc 

Я понимаю, как дочерний процесс будет раскошелиться из оболочки и как ее ребенок, как это,

Shell (pid=12) 
     \ 
     \ 
     ls (pid=13) 

но я не уверен, как подходят трубы и задние команды. Являются ли они также дочерними элементами оболочки, а не ls?

+1

Вы знакомы с утилитой 'pstree'? –

+0

Для OP: получить представление от [** этого кода **] (http://www.ladweb.net/src/ladsh4.c.html), как оболочка фактически реализует оператор '|'. поиск этой строки в коде: 'if (! (newJob.progs [i] .pid = fork()))' Тогда вы узнали, что ls, grep, wc являются дочерними процессами оболочки ... Код не является кодом bash но Bash делают аналогично .. –

ответ

2

Каждый компонент конвейера будет дочерним процессом оболочки. Если вы используете pstree -p из другого терминала, вы, вероятно, увидеть что-то вроде этого:

... 
sshd(11)---bash(12)-+-ls(13) 
        |-grep(14) 
        \-wc(15) 
... 

(! Предполагая, что вы можете запустить в то время как ваш трубопровод все еще работает)

Однако, обратите внимание, что все компоненты будут образуют один process group.

Сам трубопровод является особенностью Linux (или любой другой ОС, используемой вами), это не отдельный пользовательский процесс. Оболочка создает около anonymous pipes и подключает их к соответствующим файловым дескрипторам для каждой пары процессов в конвейере.

+0

Спасибо за помощь, ребята! –

Смежные вопросы