Хранение вывода команды Linux в именованном канале - PullRequest
1 голос
/ 16 октября 2019

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

Я пытаюсь сделать это, используя dup2 () для перенаправления стандартного вывода в именованный канал, который я создал, но дочерний процесс просто печатает выводкоманда и при попытке чтения из канала в родительском процессе я получаю следующую ошибку:

Ошибка чтения из канала: неверный дескриптор файла

У меня естьискал похожие вопросы на этом сайте, но нашел только решения для использования обычных каналов для хранения результатов exec (), и я не смог адаптировать эти решения для именованных каналов. Вот мой код:

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 #include <sys/types.h>
 #include <sys/stat.h>

 #define CMDSIZE 50
 #define BUFSIZE 5000

int main() {
    char cmd[CMDSIZE], arg[CMDSIZE], buf[BUFSIZE];
    int fd, n;
    pid_t pid = fork();

    if (pid < 0) {
        perror("Error creating process");
        return 1;
    }
    else if (pid == 0) {
        printf("SHELL > ");
        fgets(buf, BUFSIZE, stdin);
        sscanf(buf, "%s %s", cmd, arg);
        memset(buf, 0, BUFSIZE);

        printf("Working on request...\n");

        unlink("cmdpipe");
        mkfifo("cmdpipe", 0777);

        fd = open("cmdpipe", 0777);

        dup2(fd, STDOUT_FILENO);
        close(fd);

        if (arg[0] == '\0')
            execlp(cmd, cmd, NULL);
        else
            execlp(cmd, cmd, arg, NULL);
    }
    else {
        wait(NULL);

        printf("...Output ready! Displaying now.\n");

        fd = open("cmdpipe", 0777);

        if ((n = read(fd, buf, BUFSIZE)) < 0) {
            perror("Error reading from pipe");
            return n;
        }

        close(fd);
        printf("%s\n", buf);
    }

    return 0;
}

Спасибо.

...