在从该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。