Хорошо у меня есть программа, которая создает два канала-> ветвления->, 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;
}
Потомок, вероятно, должен fflush ()
свой вывод и / или правильно завершать строки. В противном случае буферизация ввода-вывода может удерживать данные на долгое время.
Вы можете попробовать установить флаг O_NONBLOCK
(используя fcntl ()
) в дескрипторе выходного файла потомка перед передачей управления, но это потребует от вас изменения родительского кода соответственно. Однако, как указано в комментариях, это не поможет вам преодолеть буферизацию, выполняемую на уровне стандартной библиотеки C, если дочерний процесс использует ввод-вывод на основе FILE
.