【发布时间】:2011-02-12 08:50:21
【问题描述】:
好的,我有一个创建两个管道的程序 -> 分叉 -> 子级的标准输入和标准输出被重定向到每个管道的一端 -> 父级连接到管道的另一端并尝试读取关联的流使用孩子的输出并将其打印到屏幕上(我最终也会让它写入孩子的输入)。
问题是,当父级尝试 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;
}
【问题讨论】:
标签: c stream pipe fork redirect