не может читать из потока до дочерних выходов?

Хорошо у меня есть программа, которая создает два канала-> ветвления->, stdin и stdout ребенка перенаправляются к одному концу каждого канала->, родитель подключен к другим концам каналов и попыток считать поток, связанный с выводом ребенка и распечатать его на экран (и я также заставлю его записать во вход ребенка в конечном счете).

Проблема, когда родитель пробует к fgets поток вывода ребенка, это просто останавливается и ожидает, пока ребенок не умирает к fgets, и затем распечатайте вывод. Если ребенок не выходит, это просто ожидает навсегда. Что продолжается? Я думал, что, возможно, fgets заблокируется, пока ЧТО-ТО не было в потоке, но не блоке полностью, пока ребенок не бросает его дескрипторы файлов.

Вот код:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
 FILE* fpin;
 FILE* fpout;
 int input_fd[2];
 int output_fd[2];
 pid_t pid;
 int status;
 char input[100];
 char output[100];
 char *args[] = {"/somepath/someprogram", NULL};
 fgets(input, 100, stdin); // the user inputs the program name to exec

 pipe(input_fd);
 pipe(output_fd);
 pid = fork();

 if (pid == 0) {
  close(input_fd[1]);
  close(output_fd[0]);
  dup2(input_fd[0], 0);
  dup2(output_fd[1], 1);
  input[strlen(input)-1] = '\0';
  execvp(input, args);
 }
 else {
  close(input_fd[0]);
  close(output_fd[1]);
  fpin = fdopen(input_fd[1], "w");
  fpout = fdopen(output_fd[0], "r");
  while(!feof(fpout)) {
   fgets(output, 100, fpout);
   printf("output: %s\n", output);
  }
 }

 return 0;
}

5
задан BobTurbo 26 April 2010 в 11:22
поделиться

1 ответ

Потомок, вероятно, должен fflush () свой вывод и / или правильно завершать строки. В противном случае буферизация ввода-вывода может удерживать данные на долгое время.

Вы можете попробовать установить флаг O_NONBLOCK (используя fcntl () ) в дескрипторе выходного файла потомка перед передачей управления, но это потребует от вас изменения родительского кода соответственно. Однако, как указано в комментариях, это не поможет вам преодолеть буферизацию, выполняемую на уровне стандартной библиотеки C, если дочерний процесс использует ввод-вывод на основе FILE .

5
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: