C 什么是fifo的缓冲版本?

C 什么是fifo的缓冲版本?,c,linux,ipc,named-pipes,file-descriptor,C,Linux,Ipc,Named Pipes,File Descriptor,Background我在玩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)) <

Background
我在玩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);
然后打开失败,出现错误
没有这样的设备或地址
,除非有人在“读取”端被阻止

分析 根据适用于
fifo()

内核为至少一个进程打开的每个FIFO特殊文件维护一个管道对象。在传输数据之前,必须在两端打开FIFO(读取和写入)。通常,打开FIFO块,直到另一端也打开。

所以这是预期的操作

问题

根据我的实验和我读到的。。。我必须假设FIFO是一种非排队、非缓冲机制,仅在有进程等待数据时才起作用

在非阻塞缓冲区(基本上是缓冲FIFO)中是否有一种不同的通信机制,或者我必须为此建立自己的消息存储/通知系统

编辑

我说我是在“玩弄”,这实际上是很有描述性的。我试图学习各种IPC机制(FIFO、套接字和管道)的细节。我正在努力学习使用
select()
,并了解如何唤醒调用select的休眠进程。原因是它是我正在分析的通信驱动程序的一部分,用于将端口连接到新平台

我从原始帖子中排除了这一点,因为它有点不相关。我只是想确保我能理解(目前)FIFO,如何使用它们,对它们的限制,以及其他IPC机制。因此,我最初的假设/问题是,FIFO的“更好”版本将存储数据,并且可以在不阻塞的情况下写入。

FIFO不仅是缓冲的,而且基本上就是缓冲的。FIFO只不过是内核中的一个缓冲区

讨论:内核有一个策略,它拒绝将数据写入缓冲区,除非进程打开FIFO进行读取。这种行为类似于管道和TCP连接,尽管如果管道或TCP连接没有读取器,内核实际上会向写入过程发送信号,并终止它(除非您安装了处理程序)。这种行为允许我们按照预期的方式将命令串在一起,例如

hexdump file.dat | head
hextump
程序读取几行后就会被终止。这是我们99%的时间都想要的,而且
hextump
不需要任何特殊代码来实现这一点

解决方案:如果您能描述更多关于您试图解决的问题的上下文,这会有所帮助

  • 如果您想要一个客户机/服务器系统,其中服务器对可由客户机读取的消息进行排队,则可以使用Unix域套接字实现这一点。Unix域套接字类似于FIFO,但在不同方面更灵活。(与其他类型的IPC相比,大多数数据库服务器更喜欢Unix域套接字。)

  • 如果您希望能够存储一个持久队列,应用程序可以在其中独立地对消息进行排队和出列,那么您将需要使用普通文件


  • 不幸的是,“玩弄先进先出”并不是什么好事情。如果您想在IPC中进行一次很好的练习,请尝试编写一个使用Unix域套接字或TCP(或同时使用这两种套接字,这并不难)的聊天服务器。您可以使用
    telnet
    nc
    (netcat)作为客户端。(确保您拥有netcat的“OpenBSD”版本。)

    听起来像是在要求一个。输入很好!我所做的有点牵扯其中,我试图通过“玩转”来保持它的简单性(我已经在原来的文章中添加了一个编辑供参考)。最终目标是在单个嵌入式Linux板上实现多进程(非网络化)。所以我想看看IPC的简单例子。FIFO看起来很简单,但后来我被一个事实困住了,那就是我在流中被阻塞了。我想知道为什么我被挡在那里,如果可以避免的话。
    hexdump file.dat | head