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

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

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

问题是,当我写入FIFO时,我可以在缓冲区中读取该数据,但读取不再阻塞。 我的理解是,在我从FIFO读取数据后,FIFO应为空,读取应该阻塞。 我是在考虑这个错误,还是我错误地管理了FIFO?

代码如下:

 #include  #include  #include  #include  #include  #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),即返回0。

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

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