Ваша программа почти работает.Чего не хватает, так это
//i am child 2 (child of the child)
close (fd[1]);
close (fd[0]);
Канал, который вы назвали fd, предназначен для связи между 'cat' и 'grep'.То, что происходит в вашем текущем коде, заключается в том, что cat выводит файл и закрывает его вывод.Grep читает все это и ждет EOF на своем входе.Так как «child 2» все еще имеет открытую входную сторону канала (она унаследовала его через fork), grep ждет вечно.Если запустить вашу программу, а затем набрать ps
, вы должны увидеть grep и wc, ожидающие завершения.
Другая вещь, которую вы обычно делаете при построении конвейера, подобного этому, это расположите его так, чтобы окончательный вариантзадача (в данном случае wc) - это та, которую ожидает оболочка.Как написано, когда ваша программа запускается из оболочки, она завершится, когда cat завершит работу, и выходные данные wc будут напечатаны, как будто из фоновой задачи.Если вы расположите канал так, чтобы wc находился под «i child 1», то оболочка будет ожидать wc вместо этого.
В качестве альтернативы вы можете отключить all из трех процессов и "child 1 "будет вызывать wait()
для ожидания всех из них перед выходом.Этот процесс ожидания будет похож на вашу собственную крошечную оболочку.