好的,我有一个程序可以创建两个管道 -> 分叉 -> 将子进程的标准输入和输出重定向到每个管道的一端 -> 父进程连接到管道的另一端并尝试读取与子进程输出相关联的流并将其打印到屏幕上(最终我也会让它写入子进程的输入)。
问题在于,当父进程尝试从子进程的输出流中获取fgets时,它只是停滞不前,等待子进程死亡才能获取fgets并打印输出。如果子进程没有退出,它就会永远等待。发生了什么?我以为可能fgets会阻塞直到流中有SOMETHING,但不会一直阻塞直到子进程放弃其文件描述符。
以下是代码:
#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;
}