背景
我正在玩 FIFO,每次我尝试在我的 fifo 上写入时,它都会阻塞,直到有人正在读取 fd 的另一侧:
int fd;
char buffer[100] = {0};
char * myfifo = "/tmp/myfifo";
mkfifo(myfifo, 0666);
printf("What would you like to send?\n");
fgets(buffer, 100, stdin);
if((fd = open(myfifo, O_WRONLY)) < 0)
printf("Couldn't open the FIFO for writing!\n");
else {
write(fd, buffer, strlen(buffer));
close(fd);
此代码有效,但在我读取/tmp/myfifo
侧面并获取数据之前它会阻塞。当我这样更改代码时:
if((fd = open(myfifo, O_WRONLY | O_NONBLOCK)) < 0)
然后打开失败并出现错误No such device or address
,除非我有人坐在“读取”侧。
分析
根据手册页fifo()
:
The kernel maintains exactly one pipe object for each FIFO special file that is opened by at least one process. The FIFO must be opened on both ends (reading and writing) before data can be passed. Normally, opening the FIFO blocks until the other end is opened also.
所以这是预期的操作。
问题
根据我的实验和我正在阅读的内容......我必须假设FIFO 是一种非排队、非缓冲机制,并且仅在有进程等待数据时才有效。
是否有不同的通信机制可以在非阻塞缓冲庄园中工作,基本上是缓冲 FIFO,还是我必须为此制作自己的消息存储/通知系统?
编辑
我说我在“玩弄”,这在这里实际上非常具有描述性。我正在尝试了解各种 IPC 机制(FIFO、套接字和管道)的来龙去脉。我正在努力学习使用select()
和理解什么可以用来唤醒调用 select 的睡眠进程。原因是它是我正在分析移植到新平台的通信驱动程序的一部分。
我将其从原始帖子中排除,因为它有点无关紧要。我只是想确保我能理解(目前)FIFO、如何使用它们、它们的限制以及其他 IPC 机制。因此,我最初的假设/问题是关于“更好”版本的 FIFO,它将存储数据并且可以在没有阻塞的情况下写入。