Я хочу реализовать интерпретатор оболочки Linux, который принимает в качестве входных данных несколько переданных по конвейеру команд, таких как «ls | grep c | sort | less», и выдает выходные данные в командной строке, а также сохраняет выходные данные в файле в c,используя только трубы и тройники.Я изменил код, приведенный в ответе по этой ссылке: Соединение n команд с трубами в оболочке?
В моем коде pipestr - это массив команд, переданных по конвейеру, и анализируемый содержит разделенное пространствоАргументы команды, т. е. для приведенного выше примера, pipestr будут иметь ["ls", "grep c", "sort", "less"] и для каждого из них будут проанализированы: parsed [0] = ["ls"],parsed [1] = ["grep", "c"] и т. д.
Я получаю вывод в командной строке, однако в файл ничего не записывается с помощью функции tee?Пожалуйста, помогите.
int pipeex(int in,int out, char ** parsed)
{
pid_t p;
p=fork();
if(p==0)
{
if(in!=0)
{
dup2(in,0);
close(in);
}
if(out!=1)
{
dup2(out,1);
close(out);
}
if(execvp(parsed[0],parsed)<0)
{
printf("Command not executed\n");
status=-1;
}
}
else
{
wait(NULL);
}
}
В основной функции:
for(i=0;pipedstr[i]!=NULL;i++)
{
parseSpace(pipedstr[i],parsed);
pid_t p;
if(i!=noofpipe-1)
{
pipe(fd);
pipeex(in,fd[1],parsed);
close(fd[1]);
in=fd[0];
}
else
{
pid_t p1;
p1=fork();
if(p1==0)
{
close(fd[1]);
in=fd[0];
if(in !=0)
dup2(in,0);
fo = open("lf.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU);
statu = tee(STDOUT_FILENO,fo,INT_MAX, SPLICE_F_NONBLOCK);
close(fo);
if(execvp(parsed[0],parsed)<0)
{
printf("Command not executed\n");
status=-1;
}
}
else
{
wait(NULL);
}
}
}