FIFO 块程序直到其他进程读取

FIFO block program until other process read

我正在使用一个 FIFO 文件,在 Linux 终端上创建为 mkfifo myFIFO,在下面的 C++ 代码中:

#include <iostream>
using namespace std;
#include <stdio.h>
int main(int argc, char** argv) {
     FILE* fp = fopen("/tmp/myFIFO", "w");
     fprintf(fp, "Hello, world!\n");
     fclose(fp);
     cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!!
     return 0;
 }

程序一直处于阻塞状态,直到其他进程读取 myFIFO。如何避免这种情况? (我希望这种和平的代码在 FIFO 中继续处理和写入,而不是进行其他进程的读取。直到 FIFO 已满,如果可能的话,我可能会丢弃最旧的消息)。

您需要以非阻塞模式打开您的 FIFO。为此,请使用 ::open 而不是 fopen,并指定 O_NONBLOCK 选项。

您还需要使用 ::write 而不是 fprintf

我找到的最好的方法是,使用O_NONBLOCK 选项,在file/pipe 中写入软件内部队列的内容。所以缓冲区是由编写器软件创建的,管道文件只有消息通道的功能。