У меня проблема с трубами. Я пытаюсь выполнить, например, ls | grep test и моя программа зависает. Моя программа - это оболочечная программа, и я получил перенаправление и другие функции для работы, но я не могу заставить трубы работать ... Что я делаю неправильно? У меня есть поиск ответов, но я не могу найти какие-либо исправления моей проблемы.Проблемы с трубами в c
if(pipe(fd_pipe) < 0)
perror("pipe error...");
if ((pid = fork()) < 0) /* fork a child process */
{
perror("ERROR: forking child process failed\n");
exit(1);
}
else if (pid == 0) /* the child process, do the first command */
{
printf("In first child...\n");
//dupPipe(fd_pipe, 1, STDOUT_FILENO); /* send to write end of pipe */
fflush(stdout);
std_out = dup(1); // for later restore...
close(fd_pipe[0]);
dup2(fd_pipe[1], 1);
printf("exec %s in first child...\n", comline[0].argv[0]);
if (execvp(comline[0].argv[0], comline[0].argv) < 0) /* execute the command */
{
fprintf(stderr,"-mish: Exe of %s failed...",comline[0].argv[0]);
fflush(stderr);
perror("");
}
}
else /* parent process*/
{
while (wait(&status) != pid) //wait for child to completion
;
fflush(stdin);
std_in = dup(0); // for later restore...
close(fd_pipe[1]);
dup2(fd_pipe[0], 0);
if (execvp(comline[1].argv[0], comline[1].argv) < 0) /* execute the command */
{
fprintf(stderr,"-mish: Exe of %s failed...",comline[0].argv[0]);
fflush(stderr);
perror("");
}
Технически, вызов 'fflush' на' stdin' не определен. Если вы хотите быть переносным, не делайте этого. –
«У меня есть поиск ответа» - поиск сложнее. [Вы видели этот вопрос?] (Https://stackoverflow.com/questions/19356075/toy-shell-not-piping-correctly)? – WhozCraig
Обратите внимание, что вам не нужно проверять возвращаемое значение 'execvp()' или любого его семейства. Если функция возвращается, она не удалась; если он преуспеет, он не возвращается. Ваш комментарий о «для последующего восстановления» нечетный; не будет никаких «позже» для восстановления, если «execvp()» будет успешным. Более четкий комментарий будет «для восстановления, если команда не выполняется», но было бы более убедительно, если бы вы показали код. –