即使在写入结束之后,也从管道读取

时间:2018-02-10 05:38:46

标签: c linux operating-system pipe fork

请您解释一下,为什么即使在父级关闭其写入结束后,子进程也能够读取?

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

int main()
{
    int fd[2];
    char buffer[20];

    pipe(fd);

    if ( fork() ==  0 ) //child
    {
        close(fd[0]); //As it is writing close the read end
        strcpy(buffer, "Hello World");
        write(fd[1], buffer, sizeof(buffer));
        close(fd[1]);
    }
    else            //parent
    {
        close(fd[1]);   //As it is reading closing the write end
        while(1)
        {
                read(fd[0], buffer, sizeof(buffer));
                printf("Buffer:%s\n", buffer);
                sleep(1);
        }
        close(fd[0]);
    }
}

O / P:孩子不断打印:

Buffer:Hello World

为什么即使父母终止,孩子也能够收到?不应该read获得EOF吗?

1 个答案:

答案 0 :(得分:0)

  

为什么即使父母终止,孩子也能够收到?不应该read获得EOF吗?

此时,父进程基本上没有读任何内容(即:read()正在返回0)并在之前的read()调用中反复打印。< / p>

您必须查看read()系统调用返回的值。该值的类型为int,基本上为:

  • -1:错误,出了点问题。
  • 0:还有其他内容无法阅读,即: EOF (您正在寻找的内容)。
  • 否则:read()存储到buffer读取的字节数。

您可以相应地重写父while - 循环:

while(1) {
    int count = read(fd[0], buffer, sizeof(buffer));
    switch (count) {
    case 0: // EOF
        break;
    case -1: // read() error
        // ... error handling ...
        break;
    default: // fine
        // count contains the number of bytes read
        buffer[count] = '\0'; // NUL character, to indicate the end of string
        printf("Buffer:%s\n", buffer);
        sleep(1);  
    }
}