为什么read()只返回stdin的第一行?

时间:2015-01-08 22:47:41

标签: c posix

我有一个C程序试图从stdin读取最多1024个字节。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    int MAX_SIZE = 1024;
    char *program = malloc(sizeof(char) * MAX_SIZE);

    int STDIN_FD = 0;

    int return_code = 0;

    int bytes_read = read(STDIN_FD, program, MAX_SIZE);
    if (bytes_read == -1) {
        printf("Could not read from stdin");
        return_code = 1;
    } else {
        printf("bytes read: %d\n", bytes_read);
        program[bytes_read] = '\0';
        printf("program: %s\n", program);
    }

    free(program);

    return return_code;
}

我编译并运行它:

$ cat testfile.txt 
hello
world
$ gcc -Wall -std=c99 oneline.c 
$ cat testfile.txt | ./a.out 
bytes read: 6
program: hello

为什么read()只用第一行输入填充我的缓冲区?我无法在man 3 read中看到对换行符的任何引用。

1 个答案:

答案 0 :(得分:4)

来自linux手册页read(2)手册:

  

返回值

     

成功时,返回读取的字节数(零表示文件结束),文件位置按此编号前进。如果此数字小于请求的字节数,则不是错误;这可能发生在例如因为现在实际可用的字节数较少(可能是因为我们接近文件结尾,或因为我们正在从管道或从终端读取),或者因为read()被信号打断了。出错时,返回-1,并正确设置errno。在这种情况下,未指定文件位置(如果有)是否发生变化。

所以这是因为你正在阅读管道。显而易见的解决方案是继续阅读,直到返回0