Создание многоуровневого канала для команд Linux - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь создать многоуровневый канал, где вводом являются команды Linux (например, ls | sort), а выводом является просто обычный вывод при вводе в консоль Linux (по сути, просто используйте execlp для выполнения команд).

Я пытался создать программу, которая работает на 1 и 2 уровнях, но я не могу заставить работать 2-й уровень, особенно с командой "ls | sort". Программа просто зависает. Я также не знаю, как продолжить дальше и добавить больше уровней (требуется для поддержки 16 всего).

// the function has to return unless the command is "exit"
void process_cmd(char *cmdline) {
    // exit program
    if (strcmp(cmdline, "exit") == 0) {
        printf("The shell program (pid=%d) terminates\n", getpid());
        exit(0);
    }

    // separate the user input into the different commands using another 
    // defined function
    char* strings[MAX_PIPE_SEGMENTS];
    int x = 0;
    int* numTokens = &x;
    tokenize(strings, cmdline, numTokens, "|");

    // 1 command
    if (*numTokens == 1) {
        pid_t pid = fork();
        if (pid == 0) {
            execlp(strings[0], strings[0], NULL);
        } else {
            wait(0);
            return;
        }
    }

    // 2 commands, this is the problem
    int ps[*numTokens];
    pipe(ps);
    pid_t pid = fork();
    if (pid == 0) {
        pid_t pid2 = fork();
        if (pid2 == 0) {
            close(1);
            dup2(ps[1], 1);
            close(ps[0]);
            execlp(strings[0], strings[0], NULL);
        } else {
            close(0);
            dup2(ps[0], 0);
            close(ps[1]);
            wait(0);
            execlp(strings[1], strings[1], NULL);
        }
    } else {
        wait(0);
        return;
    }
}
...