Я пытаюсь реализовать пример оболочки, такой как программа, которая выполняет команду ls | Туалет
Использование каналов для реализации команды. Когда я выполняю команду, я получаю следующую ошибку.
wc: стандартный ввод: неверный файловый дескриптор 0 0 0 wc: -: неверный файловый дескриптор
Пожалуйста, взгляните на код и предоставьте входные данные. Примечание: 1) parse — это библиотека, которая принимает введенные данные и возвращает каждую команду в виде связанного списка с аргументами и необходимыми данными. Parse работает нормально 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
Звонок, который вы делаете перед тем, как что-то сделать, зачем вы это делаете? - person Some programmer dude   schedule 12.10.2014