一旦在文件描述符中没有其他内容可读,则停止读取(2)

时间:2014-09-25 15:51:47

标签: c fork pipe file-descriptor

我想逐行读取文件描述符,直到没有其他内容可读。我希望read(2)在文件描述符的末尾到达时返回零,但相反,它似乎等待文件描述符被关闭。我想避免关闭我的文件描述符,因为我还要写更多内容。

以下是我所做的一个全面的例子:

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

size_t read_line(int fd, char* buffer);

int main()
{
    int fd[2];

    if (pipe(fd) != 0) {
        fprintf(stderr,"Pipe error.\n");
        exit(1);
    }

    if (fork() == 0) {
        close(fd[0]);
        int i;
        for (i = 0; i < 10; ++i)
            dprintf(fd[1], "FOO\n");
        pause();
        exit(0);
    }

    close(fd[1]);

    char buffer[20];
    while (read_line(fd[0], buffer) > 0)
        printf("%s\n", buffer);

    printf("BAR !!\n");

    exit(0);
}

size_t read_line(int fd, char* buffer)
{
    char char_buf;
    size_t buffer_size = 0;
    while (read(fd, &char_buf, 1) > 0 && char_buf != '\n')
        buffer[buffer_size++] = char_buf;
    buffer[buffer_size] = '\0';

    return buffer_size;
}

我的read_line函数应该在结尾返回零。如果我替换“pause();”它可以正常工作“关闭(fd [1]);”,但显然,这不是我的目标,因为我会避免松开管道。

谢谢!

1 个答案:

答案 0 :(得分:1)

无法通过检查read的返回值来做到这一点。原因是当文件描述符为空时,读取将仅等待。您的问题类似于等待直到没有scanf的任何输入,如果这样可以使您更容易理解。

一个解决方案是有一个特定的值,该值将停止循环。例如,如果您正在读取非负整数,则该值为-1。

另一个解决方案来自以下事实:如果管道为空,并且没有进程打开该管道进行写入,则读取返回0。因此,在完成写入后,请关闭文件分离器p [1]。(p [1 ]也必须在发送者进程中关闭)。