Я пытаюсь создать небольшую C-программу, которая реализует конвейер из двух команд bash: echo $ arithmeticOperation | до н.э.
$ arithmeticOperation - строка, взятая в качестве входных данных.
Программа отлично работает, выполняя первую команду, но когда я запускаю вторую, я получаю правильный вывод, но дочерний процесс, выполняющий команду bc, остается застрявшим, предотвращая завершение дочернего процесса.
Итак, в этой строке родительский процесс заблокирован:
waitpid (ПИД2, NULL, 0);
Как вы думаете, где может быть проблема?
Извините, если я задал вопрос неправильно, это мой первый вопрос. Спасибо.
#define SYSCALL(r,c,e) if((r=c)==-1) { perror(e);exit(EXIT_FAILURE);}
int main(){
char buf[128];
int pfd[2],err;
pid_t pid1,pid2;
SYSCALL(err,pipe(pfd),"pipe");
switch (pid1=fork()) {
case -1: { perror("fork"); exit(EXIT_FAILURE);}
case 0 : {
scanf("%s",buf);
SYSCALL(err,dup2(pfd[1],1),"dup");
close(pfd[1]);
close(pfd[0]);
execl("/bin/echo","echo",buf,(char *)NULL);
return 1;
}
}
switch (pid2=fork() ){
case -1 : { perror("fork"); exit(EXIT_FAILURE);}
case 0 : {
SYSCALL(err,dup2(pfd[0],0),"dup");
close(pfd[1]);
close(pfd[0]);
// execl("/usr/bin/bc","bc",(char *)NULL);
execlp("bc","bc",(char *)NULL);
return 1;
}
}
printf("waiting . . . \n");
waitpid(pid1,NULL,0);
printf("wait\n");
waitpid(pid2,NULL,0);
close(pfd[1]);
close(pfd[0]);
return 0;
}
Так что, если я наберу цифру "1 + 1" в качестве входной строки, я получу правильный вывод, но тогда процесс, выполняющий bc, никогда не завершится