我有以下代码:
#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(...)。
问题是,“changed”永远不会被打印!
我以 root 身份运行代码。
提前非常感谢,
最佳答案
Libevent 设计用于处理 poll
或 select
支持的相同文件描述符。这些系统调用并不是为了检查文件更改事件而设计的。它们被设计为当文件描述符可以无阻塞地读取或写入时返回,这对于常规文件来说并不是很有意义(对常规文件的读取和写入要么永远不会阻塞,要么总是可以阻塞,具体取决于您如何看待它) 。换句话说 - 除套接字、管道和 fifo:s 之外的文件描述符上的 libevent 将不起作用。
还有其他机制可以检查文件是否已更改,但这些机制不可移植。
关于c - libevent:在文件更改时引发事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586745/