Как реализовать мульти-трубу в C? - PullRequest
0 голосов
/ 29 марта 2020

Мне нужно написать небольшую оболочку, называемую shhh, которая обладает следующими возможностями:

  1. Может выполнить команду с сопровождающими аргументами.
  2. Распознавание нескольких запросов канала и их обработка.

Пример команды:

shhh> ls | more | wc

Мне нужна конкретно помощь с трубами. Я гуглил и исследовал несколько хороших дней, как реализовать это в c, но безрезультатно. Вообще говоря, у меня есть довольно хорошее представление о том, как работает труба, но когда дело доходит до реализации этой многотрубной детали, я не имею ни малейшего понятия.

Я пытался исследовать, как это сделать и пытался реализовать его в моем коде всеми способами безрезультатно. Либо это не работает, либо я не понимаю этого и не могу заставить его работать. Я также пробовал Chegg, но их эксперты бесполезны, так как они продолжают просить больше кода, и единственное, что я оставил из приведенного ниже фрагмента, это мой собственный код, который я написал и который не имеет ничего общего с проблемой. У меня сейчас есть.

Это весь код, который имеет отношение к проблеме.

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<signal.h>
#include<fcntl.h>

main()
{
    char *path, *argv[20], buf[80], n, *p;
    int m, status, inword, continu;
    int fd[2];

    while(1) {
        inword = 0;
        p = buf;
        m = 0;
        continu=0;

        printf( "\nshhh> ");

        while ( ( n = getchar() ) != '\n' || continu ) {
            if ( n == ' ' ) {
                if ( inword ) {
                    inword = 0;
                    *p++ = 0;
                }
            }
            else if ( n == '\n' )
                continu = 0;
            else if ( n == '\\' && !inword )
                continu = 1;
            else {
                if ( !inword ) {
                    inword = 1;
                    argv[m++] = p;
                    *p++ = n;
                }
                else
                    *p++ = n;
            }
        }  

        *p++ = 0;
        argv[m] = 0;

        if ( strcmp(argv[0],"exit") == 0 )
            exit (0);

вот фрагмент кода, который у меня сейчас есть :

if(fork() == 0) {
    for(y = 0; arg[v] != 0; y++) {
        if(strcmp("|", argv[y]) == 0) {
            argv[y] = 0;
            pipe(fd);
            if(fork() == 0) {
                 close(fd[0]);
                 dup(fd[0]);
                 close(fd[1]);

                 execvp(argv[0], argv);
             }
             else {
                close(fd[1]);
                dup(fd[1]);
                close(fd[0]);
            }
        }

        execvp(argv[0], argv);
        printf(" didn't exec \n");
        n2 = wait(&status);
   }

    wait(&status);
    }
}

Любая и вся помощь очень ценится. Также я должен использовать execvp() и массив аргументов (argv[]).

...