Я пытаюсь реализовать образец оболочки, такой как программа, которая выполняет команду ls | wcОшибка дескриптора файла при реализации трубопровода в C
Использование труб для реализации команды. Когда я выполняю команду, я получаю следующую ошибку.
туалет: стандартный ввод: Плохой дескриптор файла туалет: -: Плохой дескриптор файла
Пожалуйста, обратите внимание на код и обеспечивают входы Примечание: 1) синтаксического анализа является библиотека, которая принимает введенный ввод и возвращает каждую команду в виде связанного списка с аргументами и необходимыми данными. Анализировать работает отлично 2) Я выполняющийся каждую команду в другой подпроцесс следовательно вилке
#include <stdio.h>
#include <stdlib.h>
#include "parse.h"
int pip[3][2];
int main(int argc, char *argv[], char *envp[])
{
Pipe p;
Cmd c;
pipe(pip[0]);
pipe(pip[1]);
pid_t pid;
pid=fork();
char *host = "armadillo";
printf("%s%% ", host);
p = parse();
c=p->head;
printf("1 \n");
pid=fork();
if(pid==0)
{
close(pip[0][0]);
close(STDOUT_FILENO);
dup2(pip[0][1],STDOUT_FILENO);
execvp(c->args[0],c->args);
}
else
{
waitpid(pid,NULL,0);
}
printf("2 \n");
close(pip[0][1]);
close(pip[0][0]);
c=c->next;
printf("%s \n",c->args[0]);
pid=fork();
if(pid==0)
{
close(STDIN_FILENO);
dup2(pip[0][0],STDIN_FILENO);
close(pip[0][1]);
execvp(c->args[0],c->args);
}
else
{
waitpid(pid,NULL,0);
close(pip[0][1]);
close(pip[0][0]);
}
}
Почему вы открываете два раза? Я имею в виду 'fork' Call, который вы делаете, прежде чем делать что-либо, почему вы это делаете? –
@JoachimPileborg Я выполняю каждую команду в другом подпроцессе Итак, одна вилка для ls и других для wc – kairav
Будьте осторожны, когда вы закрываете дескрипторы труб. Кроме того, все процессы в конвейере должны иметь возможность запускаться одновременно; если вы дождались завершения первого перед запуском второго, вы можете написать ему больше данных, чем вписывается в канал, поэтому он блокирует ожидание второго процесса для чтения из канала, но второй процесс не будет запускаться до тех пор, пока после первого завершения, поэтому ничего очень не происходит в течение очень долгого времени. –