Я пытаюсь создать небольшую программу на C, которая реализует конвейер из двух команд bash: echo $ arithmeticOperation | До нашей эры
$ arithmeticOperation - это строка, принимаемая в качестве входных данных.
Программа отлично работает, выполняя первую команду, но когда я запускаю вторую, я получаю правильный результат, но дочерний процесс, выполняющий bc, остается зависшим, предотвращая завершение дочернего процесса.
Таким образом, в этой строке блокируется родительский процесс: waitpid (pid2, 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, никогда не завершается
bc
получил EOF. - person Jonathan Leffler   schedule 17.05.2019