Решено: Перехват вывода дочернего приложения (С помощью pipe)

Модератор: Модераторы разделов

Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Решено: Перехват вывода дочернего приложения

Сообщение serzh-z »

Имеется код:

Код: Выделить всё

#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 в родительском приложении. =) Спасибо себе же. =)
Спасибо сказали: