Меня смущает то, как Linux может позволить приложению читать из канала, например «cat /etc/hosts | grep 'localhost'». Я знаю, что в независимой программе разветвляется ребенок и общается по трубе между собой. Но для двух независимых программ, общающихся по каналу, я не знаю, как это сделать. В примере «cat /etc/hosts | grep 'localhost'». Как Grep может узнать, какой дескриптор файла он должен прочитать, чтобы получить ввод от «cat /etc/hosts». Существует ли «обычный» канал, предоставляемый ОС, чтобы Grep знал, где получить ввод? Я хочу знать механизм этого.
Как Linux Os позволяет приложениям читать из канала
Ответы (1)
grep в вашем примере получает его из стандартного ввода. Оболочка отвечает за вызов pipe(2)
для создания канала, а затем dup2(2)
в каждом из fork(2)
дочерних элементов, чтобы назначить их конец канала для stdin или stdout перед вызовом одной из exec(3)
функций для фактического запуска других исполняемых файлов.
person
Ignacio Vazquez-Abrams
schedule
15.11.2010
Важным моментом здесь является то, что в приведенном примере и
cat
, и grep
являются дочерними процессами оболочки, поэтому они связаны.
- person caf; 16.11.2010
Это
pipe(2)
, а не mkfifo(3)
, так как канал безымянный.
- person Roman Cheplyaka; 19.11.2010