труба 2 команды Linux в C


Я пишу программу симпел, которые могут в основном сделать то же самое, как трубопроводы две команды Linux может сделать. Например, ЛС-л | грэп vars.shэто можно сделать на Linux консоли. Мне нужно написать программу на C, который может сделать то же самое. Я думаю, что я получил это работает, но я хочу знать, если я делаю это обряд, и если есть какие-то изменения я могу сделать в моем коде.

Вот мой код:

#include <stdio.h> // Voor verschillende I/O's, macro's, declaraties.
#include <stdlib.h> // Om de system call te activeren.
#include <unistd.h> // Laden van constanten en types.

int main()
{
    pid_t pid;
    int pipefd[2];
    pipe(pipefd);
    pid = fork();

    if(pid==-1){
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    if(pid>0){
        close(pipefd[0]);
        dup2(pipefd[1],1);
        execlp("ls","ls","-l",NULL);
    }
    else{
        close(pipefd[1]);
        dup2(pipefd[0],0);
        execlp("grep","grep",".bashrc",NULL);
        exit(EXIT_FAILURE);
    }
}

Любая обратная связь,переделок или изменений приветствуются.



4026
4
задан 16 июня 2011 в 08:06 Источник Поделиться
Комментарии
2 ответа

Единственный способ, что я мог видеть, это можно сделать в POSIX будет использовать к popen() вместо использования необработанных труб. Она также возвращает поток указатель, который может использоваться с C стандартные функции ввода/вывода, Как fprintf(), чем fgets()и т. д. чтобы читать и/или писать на процесс с другой стороны трубы, созданные к popen(). Согласно спецификации POSIX, с к popen(),


Окружающей среды выполнено
команда должна быть как бы дочерний процесс
были созданы в к popen() вызов
с помощью функции fork (), и
ребенок вызывается утилита Ш. с помощью
звоните:

пропускная(Шелл путь, "Ш", "-с", команду,
(типа char *)0);

где путь оболочка неустановленном
путь к утилите ш.

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

С вашим примером, используя к popen() будет выглядеть следующим образом:

#include <stdio.h>
#define BUFFERSIZE 128

FILE *ls_proc, *grep_proc;
ls_proc = popen("ls -l", "r");
grep_proc = popen("grep .bashrc", "w");

char buffer[BUFFERSIZE];

//read from one child process and write to the other
while (fgets(buffer, BUFFERSIZE, ls_proc) != NULL)
fprintf(grep_proc, "%s", buffer);

pclose(ls_proc);
pclose(grep_proc);

1
ответ дан 16 июня 2011 в 09:06 Источник Поделиться

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

1
ответ дан 20 июля 2011 в 01:07 Источник Поделиться