Как Linux Os позволяет приложениям читать из канала

Меня смущает то, как Linux может позволить приложению читать из канала, например «cat /etc/hosts | grep 'localhost'». Я знаю, что в независимой программе разветвляется ребенок и общается по трубе между собой. Но для двух независимых программ, общающихся по каналу, я не знаю, как это сделать. В примере «cat /etc/hosts | grep 'localhost'». Как Grep может узнать, какой дескриптор файла он должен прочитать, чтобы получить ввод от «cat /etc/hosts». Существует ли «обычный» канал, предоставляемый ОС, чтобы Grep знал, где получить ввод? Я хочу знать механизм этого.


person terry    schedule 15.11.2010    source источник


Ответы (1)


grep в вашем примере получает его из стандартного ввода. Оболочка отвечает за вызов pipe(2) для создания канала, а затем dup2(2) в каждом из fork(2) дочерних элементов, чтобы назначить их конец канала для stdin или stdout перед вызовом одной из exec(3) функций для фактического запуска других исполняемых файлов.

person Ignacio Vazquez-Abrams    schedule 15.11.2010
comment
Важным моментом здесь является то, что в приведенном примере и cat, и grep являются дочерними процессами оболочки, поэтому они связаны. - person caf; 16.11.2010
comment
Это pipe(2), а не mkfifo(3), так как канал безымянный. - person Roman Cheplyaka; 19.11.2010