背景
我玩弄一个FIFO每次我试图在我的FIFO它会阻止写,直到有人读fd的另一边时间:什么是FIFO的缓冲版本?
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
,除非我有挡在了“读”侧坐的人。
分析 按照该man page为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()
和了解什么可以用来唤醒它称之为选择睡眠的进程。原因是它是通信驱动程序的一部分,我正在分析端口到一个新的平台。
我排除这种从原来的职位,因为它是有点无关紧要。我只是想确保我能够理解(目前)FIFO,如何使用它们,限制它们以及其他IPC机制。因此,我最初的假设/问题关于FIFO的“更好”版本,它将存储数据并且可以无阻塞地写入。
听起来就像你要求[消息队列](http://en.wikipedia.org/wiki/Message_queue)。 – chrisaycock