LINUX.ORG.RU

Сообщения fexunexu

 

Получение stdin/stdout дочернего процесса

Пытаюсь используя Си сделать fork, execl и получить stdin/stdout дочернего процесса. Нужно что бы для дочернего процесса это работало без лишних телодвижений с его стороны (т.е. ему не нужно знать что он на самом деле пишет в pipe). К примеру printf(«QWERTY») — он думает что пишет в stdout, а на самом деле пишет в канал. С кодом это станет яснее =)

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main(int argc, char *argv[])
{
    int fd[2];
    int pid;

    char data[] = "QWERTY";

    pipe(fd);

    if((pid = fork()) == 0) {
        close(0);
        dup(fd[0]);

        close(1);
        dup(fd[1]);

        close(fd[0]);
        close(fd[1]);
        execl("/home/<user>/test", "/home/<user>/test", NULL);

        exit(EXIT_FAILURE);
    } else {
        write(fd[1], data, 6);
        close(fd[1]);

        char buf[1024];
        read(fd[0], buf, 1024);
        close(fd[0]);

        printf("[%d] Output: \n%s\n", getpid(), buf);
    }

    return 0;
}

В ветке для дочернего процесса я закрываю stdin/out, dup берет их (уже свободные и минимальные) файловые дескрипторы и заставляет их указывать на in/out пайпа.

В ветке родителя я просто хочу сначала писать данные в stdin дочернего процесса (которые у меня fd[1]) и потом получить уже обработанные данные из stdout (который fd[0]).

Если просто читать, но не писать данные дочернему процессу, то все работает нормально. Я могу к примеру запустить «ls» и получить список директорий, не важно :). Проблемы возникают когда нужно отправить порцию данных, а потом получить эти данные уже обработанными.

Если исполнить этот код, то QWERTY попадает обратно ко мне. Т.е. я отправил, а потом я же и получил :(. Оно и не удивительно, это же pipe. Мне надо как-то это исправить, данные должны попадать к test'у.

test -> просто ещё одна программа на Си. Берет одну строку что приходит на stdin и пишет её в файл, всё.

После запуска кода должен появится файл с текстом QWERTY, а ко мне обратно должен вернуться текст «wrote» из test'а.

Я понимаю что сложно объяснил.

 , ,

fexunexu
()

RSS подписка на новые темы