繁体   English   中英

如何使用 inotify 来判断一个命名的 pipe 何时打开?

[英]How can I use inotify to tell when a named pipe is opened?

总体目标是我试图制作一个名为 pipe 的文件,读取时它是当前帧缓冲区的 PNG 文件。 从网上拼凑出各种片段,比如 Andrew Duncan 的 PNG 创建者,我有一些东西可以创建和编写 PNG pipe 已打开。

似乎我应该能够使用inotify_add_watch( fd, filename, IN_OPEN | IN_ACCESS )来判断何时有人打开文件开始读取,然后我打开它进行写入并发送我的 PNG 文件数据,然后关闭文件。

pipe 正在创建,但是当我尝试从文件中读取时没有收到监视事件(cat fbpipe.png > pipefile.png)。 它在 watch 事件的第一次 read() 时被阻塞。

相关代码片段:

// Creating the named file(FIFO)
// mkfifo(<pathname>, <permission>)
mkfifo(filename, 0666);

/*creating the INOTIFY instance*/
fd = inotify_init();

wd = inotify_add_watch( fd, filename, IN_OPEN | IN_ACCESS );

/*read to determine the event change happens. Actually this read blocks until the change event occurs*/ 

length = read( fd, buffer, EVENT_BUF_LEN ); 

/*checking for error*/
if ( length < 0 ) {
   perror( "read" );
   return -1;
 }

  //  READ MY FRAMEBUFFER AND THEN WRITE THE DATA:

  FILE* file;
  file = fopen(filename, "wb" );

  fwrite(buffer, 1, buffersize, file);
  fclose(file);

您不需要为此进行 inotify。

如果您打开名为 pipe 进行写入,则 open 系统调用将阻塞,直到某个进程打开名为 pipe 进行读取。 这基本上就是你想要的。 当打开返回时,您知道有一个客户在等待阅读。

同样,如果您打开 pipe 进行读取,则打开将阻塞,直到某个进程打开 pipe 进行写入。 此外,读取将阻塞,直到写入器实际写入数据。 所以命名的 pipe 基本上负责同步。

这构成了一个非常简单的客户端-服务器架构,但它仅在您没有两个并发客户端的情况下才有效。 对于更通用的方法,使用 Unix 域 sockets。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM