libevent:在文件更改时引发事件

Posted

技术标签:

【中文标题】libevent:在文件更改时引发事件【英文标题】:libevent: raise event on file change 【发布时间】:2012-11-27 14:46:36 【问题描述】:

我有以下代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <event.h>

void fd_cb(int fd,short event,void *arg)
        printf("changed\n");


int main(int argc, const char* argv[])
        struct event eoh_ev;
        FILE *fp;
        int fd;
        fp=fopen("/var/log/syslog","rw");
        fd=fileno(fp);

        event_init();
        event_set(&eoh_ev,fd,EV_READ|EV_WRITE,fd_cb,NULL);
        event_add(&eoh_ev,NULL);
        event_dispatch();


        return 0;

如您所见,当有内容写入 /var/log/syslog 时,我尝试调用 fd_cb(...)。

问题是,“更改”永远不会被打印出来!

我正在以 root 身份运行代码。

非常感谢,

【问题讨论】:

您可能希望使用inotify 来接收来自文件更改的事件。 【参考方案1】:

Libevent 旨在处理pollselect 支持的相同文件描述符。这些系统调用并非旨在检查文件更改事件。它们旨在在文件描述符可以在不阻塞的情况下读取或写入时返回,这对常规文件没有多大意义(对常规文件的读取和写入永远不会阻塞或总是会阻塞,这取决于您如何看待它) .换句话说 - 除了套接字、管道和 fifo:s 之外的文件描述符上的 libevent 将不起作用。

还有其他机制可以检查文件是否已更改,但这些机制不可移植。

【讨论】:

好的,很酷。感谢你的回答。我实际上是在尝试监视“/sys/class/gpio/gpio4/value”

以上是关于libevent:在文件更改时引发事件的主要内容,如果未能解决你的问题,请参考以下文章

需要关于使用 libevent 动态更改计时器事件的建议

带有 libevent/libev 的 C 或 C++:监视 unix 套接字

libev学习

libevent

libevent 阅读记录二

libevent 中的应用程序驱动事件