Вы не четко объяснили, что делает эта программа, что вы считаете неправильным.Однако, когда я запускаю эту программу самостоятельно (после добавления соответствующих заголовков - в будущем, пожалуйста, не оставляйте их вне вашего вопроса), она зависает, пока я не нажму control-C.Я собираюсь предположить, что это то, что вы не хотели, и что вы сделали хотите, чтобы он напечатал вывод wc
и затем завершил работу.
Программа зависает, потому что fd1[1]
все еще открыт в родительском процессе в тот момент, когда он вызывает wait
.wc
не получит индикацию EOF, пока все файловых дескрипторов, относящихся к стороне записи канала, не будут закрыты.Но родительский процесс не собирается закрывать сторону записи канала до тех пор, пока не выйдут оба его дочерних процесса, а wc
не будет выходить до тех пор, пока не получит EOF, поэтому у вас есть тупик.
Вам нужно добавить close(fd1[1])
на родительской стороне первого if
, непосредственно перед p2 = fork()
.Этого достаточно, чтобы выйти из тупика.Вы должны также добавить close(fd1[0])
на родительской стороне second if
, непосредственно перед waitpid
вызовами.И вы также должны проверить все операции на наличие ошибок.