c-如何使用inotify来判断命名管道何时打开



总体目标是,我正在尝试制作一个命名管道,当读取时,它是当前帧缓冲区的PNG文件。通过从网上拼凑出的各种片段,比如Andrew Duncan的PNG创建者,我有一些可以创建和编写PNG的东西,但诀窍是,在有人阅读之前,我不需要编写管道,这样图像就是最新的,而不是在管道打开时返回。

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

正在创建管道,但当我尝试从文件(cat fbpipe.png>pipefile.png(读取时,我没有得到监视事件。它在监视事件的第一次读取((时被阻塞。

相关代码片段:

// 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。

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

类似地,如果打开管道进行读取,则打开将阻塞,直到某个进程打开管道进行写入。此外,在写入程序实际写入数据之前,读取将被阻止。因此,命名管道基本上负责同步。

这就形成了一个非常简单的客户端-服务器体系结构,但只有当您从来没有两个并发客户端时,它才能工作。对于更通用的方法,请使用Unix域套接字。

最新更新