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