конвейер неисправностей три команды "dmesg | sort | more" c ++ - PullRequest
0 голосов
/ 14 октября 2010

Я успешно передал вывод одной команды на вход другой, а затем отобразил вывод второй команды на экран.

Я хочу сделать это тремя последовательными командами. (на самом деле в конце концов я хочу сделать это с помощью N команд, переданных в программу во время выполнения.

Это моя попытка конвейерной передачи трех команд вместе.

ОБНОВЛЕНО: я обновил свой вопрос, чтобы отразить мою последнюю попытку.

    #include <string.h>
    #include <fstream>
    #include <iostream>
    #include <unistd.h>
    #include <stdio.h>
    #include <sys/wait.h>
    #include <sys/types.h>
    using namespace std;

    int main(int argc, char * argv[])
    {
             pid_t pid;
        int pfd[2];
        char* prgname = NULL;
        if(pipe(pfd) == -1)
        {
                perror("error on pipe call");
                return(1);
        }
        for(int j = 0;j<numberOfCommands;j++)
        {
                cout<<commands[j]<<"_"<<endl;
        }
        pid = fork();
        if(pid == 0){//child process
                close(pfd[0]); //close read end of pipe
                dup2(pfd[1],1);//connect the pipes
                close(pfd[1]);//close extra file descriptors
                prgname = (char*)"dmesg"; //commands[0];//first command
                execlp(prgname, prgname, 0);//Load the program
        }
        else
        {
                int pfd2[2];
                if(pipe(pfd2) == -1)
                {
                        perror("error on pipe call 2");
                        return(1);
                }
                pid = fork();
                if(pid == 0)//child
                {
                        close(pfd[1]);
                        dup2(pfd[0],0);
                        close(pfd[0]);
                        close(pfd2[0]);
                        dup2(pfd2[1],1);
                        close(pfd2[1]);
                        prgname = (char*)"sort";
                        execlp(prgname,prgname,0);
                }
                else
                {
                close(pfd2[1]); //close the write end of the pipe
                dup2(pfd2[0],0);//connect the pipes
                close(pfd2[0]); //close extra file descriptor
                prgname = (char*)"more"; //commands[1];//now run the second command
                execlp(prgname, prgname, 0);//Load the program
                }
        }
        return 0;
}

Я жестко закодировал все значения для простоты. Программа отображает, что должно быть выводом «dmesg | more», но не выполняет сортировку, а затем останавливается. Я вижу начало dmesg и многое другое в левом нижнем углу, но я не могу больше видеть.

Есть идеи?

1 Ответ

2 голосов
/ 14 октября 2010

pipe(2) предоставляет только 2 файловых дескриптора для 1 канала. Третий файловый дескриптор (pfd[2]) является ненужным и никогда не инициализируется. Если вы хотите создать конвейер с тремя командами в нем, вам нужно дважды вызвать pipe(), чтобы получить два канала: один для соединения первого и второго процессов и один для соединения второго и третьего процессов.

...