Код: Выделить всё
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
int main()
{
int fds1[2];
int fds2[2];
pid_t pid;
pipe(fds1);
pipe(fds2);
pid = fork();
if (pid == (pid_t) 0) {
close(fds1[0]);
close(fds2[0]);
dup2(fds1[1], STDOUT_FILENO);
dup2(fds2[1], STDERR_FILENO);
close(fds1[1]);
close(fds2[1]);
execlp("./pipe.sh", "pipe.sh", 0);
} else {
FILE *stream1;
FILE *stream2;
close(fds1[1]);
char buf1[128] = {0};
stream1 = fdopen(fds1[0], "r");
fread(&buf1, sizeof buf1 - 1, 1, stream1);
printf("CATCHED OUTPUT: %s\n", buf1);
close(fds1[0]);
char buf2[128] = {0};
stream2 = fdopen(fds2[0], "r");
fread(&buf2, sizeof buf2 - 1, 1, stream2);
printf("CATCHED ERROR: %s\n", buf2);
close(fds2[0]);
waitpid(pid, NULL, 0);
}
return 0;
}pipe.sh:
Код: Выделить всё
#!/bin/sh
echo 'OUT'
echo 'ERR' >&2То есть, родительскому приложению требуется перехватить вывод дочернего. Сделать это надо РАЗДЕЛЬНО: вывод в STDERR должен быть отделён от STDOUT. Приведённое выше приложение виснет на чтенеи из stream2. Т.е. имеем:
QUOTE писал(а):$ ./pipe
CATCHED OUTPUT: OUT
_
Моя не понимать. Что не так?
UPD: Однако,.. перечитал свой код в сообщении на форуме и сразу увидел баг: не был закрыт второй конец пайпа fds2 для STDERR в родительском приложении. =) Спасибо себе же. =)