2012-09-28 97 views
0

背景
我玩弄一个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 pagefifo()
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的“更好”版本,它将存储数据并且可以无阻塞地写入。

+1

听起来就像你要求[消息队列](http://en.wikipedia.org/wiki/Message_queue)。 – chrisaycock

回答

1

不仅是一个缓冲FIFO,但是这基本上都是一个FIFO是。 FIFO只不过是内核中的缓冲区。

讨论:内核有一个策略,它拒绝将数据写入缓冲区,除非进程已打开FIFO进行读取。这种行为类似于管道和TCP连接,但如果有一个管道或TCP连接没有读者,内核将实际信号的写进程,终止它(除非你安装一个处理程序)。这种行为使我们能够串起来的命令,我们所期望的方式,例如,

hexdump file.dat | head 

hexdump程序就会被杀死一次head读了几行。这是我们99%的时间所需要的,并且hexdump不需要任何特殊的代码来实现这一点。

解决方案:这将有助于如果你描述一些关于你正试图解决的问题的更多上下文。

  1. 如果你想在服务器队列可以通过客户端读取消息的客户机/服务器系统,你可以使用Unix域套接字实现这一目标。 Unix域套接字与FIFO类似,但在各种方面更灵活。 (大多数数据库服务器比其他类型的IPC更喜欢Unix域套接字。)

  2. 如果您希望能够存储持久队列,其中应用程序可以独立排队和出队消息,那么您将需要使用普通文件。

不幸的是,“玩FIFO”并不值得继续。如果你想在IPC上做一个很好的练习,可以尝试编写一个聊天服务器,它使用Unix域套接字或TCP(或者两者同时使用,这并不困难)。您可以使用telnetnc(netcat)作为客户端。 (确保你有netcat的“OpenBSD”版本。)

+0

很好的投入!我正在做的是有一点参与,我试图通过“玩耍”保持简单(我已经为原来的职位信息添加了一个编辑)。最终目标是在单个嵌入式Linux板(非联网)上实现多个进程。所以我想看看IPC的简单例子。先进先出似乎很简单,但后来因为我在流中被阻塞而被卡住了。想知道为什么我在那里被挡住了,是否可以避免。 – Mike