Реализация трубопровода ("|") с использованием C .. (используется вилка) - PullRequest
9 голосов
/ 03 февраля 2010
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char **argv)
{
    int fd[2];
    pid_t childpid;
    pipe(fd);
    childpid=fork();
    if (childpid == -1)
    {
        perror("Error forking...");
        exit(1);
    }
    if (childpid)   /*parent proces*/   //grep .c
    {
        wait(&childpid);        //waits till the child send output to pipe
        close(fd[1]);
        close(0);       //stdin closed
        dup2(fd[0],0);
        execlp(argv[2],argv[2],argv[3],NULL);

    }
    if (childpid==0)  //ls
    {
        close(fd[0]);   /*Closes read side of pipe*/
        close(1);       //STDOUT closed
        dup2(fd[1],1);
        execl(argv[1],NULL);
    }
    return 0;
}

Если я задаю аргумент командной строки как "ls grep .c", я должен отобразить все файлы ".c".

псевдокод: - Мой дочерний процесс запустит "ls", а родительский процесс запустит "grep .c" .. Родительский процесс ожидает завершения дочернего процесса, чтобы дочерний процесс записывал в канал.

Тестовый прогон: -

bash-3.1$ ls | grep .c
1.c
hello.c
bash-3.1$ ./a.out ls grep .c
bash-3.1$

Почему это происходит?

Ответы [ 3 ]

8 голосов
/ 03 февраля 2010

Простая ошибка: ваш execl вызов на самом деле должен быть execlp. Кроме того, вы можете избавиться от операторов wait и close. Затем вы должны проверить код ошибки execlp.

1 голос
/ 22 июля 2013

Пожалуйста, обратитесь к ответу в вопросе ниже для кода для реализации канала.

Реализация канала в Linux с использованием c

1 голос
/ 03 февраля 2010

Еще одна вещь, close(0) и close(1) не нужны, функция dup2 () автоматически сделает это за вас.

...