2016-09-30 1 views
2

Выполняю межпроцессное взаимодействие через системный вызов pipe(). Ребенок записывает на один конец, и родитель должен читать другой конец трубы.Что произойдет с Linux pipe(), если один конец закроется перед другим

Родитель перед началом чтения waitpid() для завершения ребенка. Если дочерний элемент вышел с ненулевым возвращаемым значением - тогда он указывает, что у ребенка были ошибки. Таким образом, родитель просто закрывает дескриптор канала и перемещается без чтения.

Неужели это будет работать в случае успешного завершения ребенка. Родитель эффективно пожинает ребенка перед чтением трубы? Если да, то что произойдет с данными, которые находятся в пути? ОС будет заботиться о данных, безопасно достигая родительского конца?

ответ

2

Родительский процесс открывает трубу. Два указателя в PDT указывают на трубу. Один для письма и один для чтения.

Всякий раз, когда дочерний процесс создается с использованием fork, PDT дублируется. Следовательно, дочерний процесс будет иметь свои собственные указатели в PDT, указывающие на PIPE.

Сначала труба пуста, если родительский процесс пытается прочитать, он будет блокироваться. И вы никогда не создадите дочерний процесс. Это закончится в тупике.

Если вы закрываете конец записи перед чтением, у вас не будет взаимоблокировки, но тогда дочерний процесс не сможет записать в трубу (прочитайте выше, почему).

Так что это должен быть ваш поток:

1. Parent process creates pipe 
2. fork() 
3. in parent process you close the writing end 
4. in child process you close the reading end 
5. read/write to pipe.