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

时间:2015-03-20 18:41:16

标签: c linux pipe

我正在学习Linux中的管道编程,并且无法理解管道/ FIFO管理。

我写了一个小程序,打开我创建的FIFO(在执行程序之前,我在终端中执行了mkfifo newfifo)。然后我反复读取并转储我的字符缓冲区。我使用echo "message" > newfifo从另一个终端的cmd线填充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;
    }
  }
}

2 个答案:

答案 0 :(得分:1)

您对fifos如何工作的理解是不正确的。它们很像管道:如果写入结束(echo命令已终止),则读取结束将读取文件结束(EOF),即返回0.

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

中所述

答案 1 :(得分:1)

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