Многочисленные конвейерные команды в оболочке Linux с использованием тройников и каналов в C - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу реализовать интерпретатор оболочки 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);
            }
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...