在刚刚从该 FIFO 中读取所有数据后,是否应该从 FIFO 中读取块?

Should a read from FIFO block after all the data was just read from that FIFO?

我正在 Linux 中学习管道编程,但在理解管道/FIFO 管理方面遇到了困难。

我写了一个小程序来打开我创建的 FIFO(我在执行程序之前在我的终端中做了 mkfifo newfifo)。然后我反复读取并转储我的字符缓冲区。我正在使用来自另一个终端的 cmd 行的 echo "message" > newfifo 填充 FIFO。

问题是当我写入 FIFO 时,我可以读取缓冲区中的数据,但是读取不再阻塞。我的理解是,我从FIFO中读取数据后,FIFO应该是空的,读取应该会阻塞。是我想错了,还是我管理 FIFO 不正确?

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>

#define NEWPIPE "./newfifo"

void main()
{
  int great_success = 0; 
  int fd;
  char buffer[20];

  fd = open(NEWPIPE, O_RDONLY);

  while (1) {
    great_success = read(fd, buffer, 20);

    if (great_success < 0) {
      printf("pipe failed\n");
    } else {
      printf("buffer : %s\n", buffer);
      printf("great_success = %d\n", great_success);
      great_success = 0;
    }
  }
}

您对 fifos 工作原理的理解不正确。它们很像管道:如果写入端关闭(echo 命令已终止),读取端将读取文件结尾(EOF),即 return 0.

请注意,当您打开 fifo 时,它不是读取阻塞的。阻塞系统调用是 open() 系统调用,如 http://linux.die.net/man/4/fifo

中所述

因为进程(echo "message" > newfifo)是一个短程序,它很快就结束了。一旦进程终止,管道就没有写端,所以另一个进程中的读端得到一个 EOF。