Получение 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'а.
Я понимаю что сложно объяснил.