为什么fprintf和fscanf不适用于管道

时间:2017-04-11 14:52:28

标签: c unix

我编写了创建管道的程序,将数字写入管道,从管道读取并将其打印到stdout。但似乎fscanf看到空管流,虽然我做了fflush。

为什么fprintf不打印任何东西?

int main() {
    int fd[2];
    pipe(fd);

    FILE* write_file = fdopen(fd[1], "w");
    FILE* read_file = fdopen(fd[0], "r");
    int x = 0;
    fprintf(write_file, "%d", 100);
    fflush(write_file);
    fscanf(read_file, "%d", &x);

    printf("%d\n", x);
}

2 个答案:

答案 0 :(得分:4)

你必须关闭管道的写入端,而不仅仅是冲洗它。否则,fscanf()无法知道,如果仍有数据要读取(更多数字):

fprintf(write_file, "%d", 100);
fclose(write_file);
fscanf(read_file, "%d", &x);

或者,在数字后写一个空白,使fscanf()停止寻找更多数字:

fprintf(write_file, "%d ", 100);
fflush(write_file);
fscanf(read_file, "%d", &x);

这应该可以解决您的问题。

答案 1 :(得分:1)

fscanf(read_file,"%d")只要检索到与模式"%d"匹配的内容,即只要没有读取空格,非数字等字符,就会从流中读取fscanf "等待"直到下一个角色进来。

因此,fprintf(write_file, "%d\n", 100);将解决问题,因为它会终止"写入管道的号码,以便后续的fscanf也将被终止。