Я пишу простую программу для передачи между тремя командами. Для каждой команды я разветвляю дочерний элемент и вызываю в нем execvp, в то время как родитель ожидает завершения execvp (обратите внимание, что, поскольку я разветвляюсь три раза, я трижды вызываю wait (NULL))
Я создал две трубы, pipe_A и pipe_Z. Поток что-то вроде:
Команда 1 записывает свой вывод в pipe_A,
команда 2 читает входные данные из pipe_A, затем записывает выходные данные в pipe_Z, затем
команда 3 читает входные данные из pipe_Z, а затем записывает в стандартный вывод.
Проблема в том, что программа застревает во втором ожидании (NULL). В моем коде это строка сразу после 'printf ("достигла \ n");'. Программа не завершается и застревает, пока я не отправлю прерывание.
Если я заменю все три команды на одну и ту же команду "echo hello", это ничего не даст, но программа завершится, по крайней мере.
Я написал программу меньшего размера (с одинаковой структурой), в которой всего две команды ("echo hello" и "wc"), и она также зависает только при первом ожидании (NULL). Тем не менее, я заметил, что если я вызываю execvp для второй команды в основной программе, вывод выводится, как и ожидалось. Однако программа также немедленно завершает работу (из-за execvp), поэтому я не хочу этого делать.
Я подозреваю, что совершаю очень очевидную ошибку из-за отсутствия понимания, как работают каналы, или как работает вызов функции ожидания (NULL).
int main () {
//### COMMANDS AS STRING ARRAYS ###
char * cmds1[3] = {"echo","hello", NULL};
char * cmds2[3] = {"cat","-",NULL};
char * cmds3[3] = {"wc", NULL};
//### CREATING PIPES ###
int pipe_A[2];
int pipe_Z[2];
pipe(pipe_A);
pipe(pipe_Z);
//### FIRST FORK FOR FIRST EXECVP ###
int pid = fork();
//Child process
if(pid==0){
close(pipe_A[0]);
dup2(pipe_A[1], STDOUT_FILENO);
execvp(cmds1[0],cmds1);
exit(1);
}
//Parent process
else if(pid >0){
wait(NULL);
}
//### SECOND FORK FOR SECOND EXECVP ###
int pid2 = fork();
//Child process
if(pid2==0){
close(pipe_A[1]);
dup2(pipe_A[0],STDIN_FILENO);
close(pipe_Z[0]);
dup2(pipe_Z[1], STDOUT_FILENO);
execvp(cmds2[0],cmds2);
exit(1);
}
//Parent process
else if(pid2>0){
printf("reached\n");
wait(NULL);
}
//### THIRD FORK FOR THIRD EXECVP ###
int pid3 = fork();
//Child process
if(pid3==0){
close(pipe_Z[1]);
dup2(pipe_Z[0],STDIN_FILENO);
execvp(cmds3[0],cmds3);
exit(1);
}
//Parent process
else if(pid2 >0){
wait(NULL);
}
//### END OF PROGRAM ###
return 0;
}
Ожидаемое значение «1 1 6», но программа не завершается.