我正在尝试使用inotify
来监控文件/dev/hvc0
的更改,使用以下内容:
#include <stdio.h>
#include <sys/inotify.h>
#include <stdlib.h>
#define EVENT_SIZE (sizeof(struct inotify_event))
#define BUF_LEN (1024 * (EVENT_SIZE + 16))
#define WATCH_FILE "/dev/hvc0" /* This file should be present
before this program is run */
int main() {
int notify_fd;
int length;
int i = 0;
char buffer[BUF_LEN];
notify_fd = inotify_init();
if (notify_fd < 0) {
perror("inotify_init");
}
int wd = inotify_add_watch(notify_fd, WATCH_FILE, IN_MODIFY | IN_ACCESS);
int length_read = read(notify_fd, buffer, BUF_LEN);
if (length_read) {
perror("read");
}
while (i < length_read) {
struct inotify_event *event =
(struct inotify_event *) &buffer[i];
if (event->len) {
if (event->mask & IN_ACCESS) {
printf("The file %s was accessed.\n", event->name);
} else if (event->mask & IN_MODIFY) {
printf("The file %s was modified.\n", event->name);
}
}
}
(void) inotify_rm_watch(notify_fd, wd);
(void) close(notify_fd);
return 0;
}
但是,如果访问/修改了文件,则不会打印。但是,每当我将要监视的路径更改为目录并更改文件时,它都会打印出正确的事件。
inotify
是否也适用于监控文件更改?或者我做错了什么?
谢谢!
答案 0 :(得分:1)
您缺少增加i
。在循环结束之前添加:
i += EVENT_SIZE + event->len;
如果要监视更改,还需要将读取/打印操作包装在无限循环中。
答案 1 :(得分:0)
我不明白为什么event->len
返回零可能是因为没有返回文件名。但仅出于测试目的,您只需对其进行评论。在第二点
你对i的处理被破坏了,你永远不会在循环中将它重置为0。这导致任何后来的inotify事件只有在比它们之前的最长事件更长时才被考虑,这可能不是你想要的。请在while循环中请放i += EVENT_SIZE + event->len;
int main() {
int notify_fd;
int length;
int i = 0;
char buffer[BUF_LEN];
notify_fd = inotify_init();
if (notify_fd < 0) {
perror("inotify_init");
}
int wd = inotify_add_watch(notify_fd, WATCH_FILE, IN_MODIFY | IN_ACCESS);
while(1)
{
length = read( notify_fd, buffer, BUF_LEN );
if ( length < 0 ) {
perror( "read" );
}
while ( i < length )
{
struct inotify_event *event =
(struct inotify_event *) &buffer[i];
// if (event->len) {
if (event->mask & IN_ACCESS) {
printf("The file %s was accessed.\n", event->name);
} else if (event->mask & IN_MODIFY) {
printf("The file %s was modified.\n", event->name);
}
// }
i += EVENT_SIZE + event->len;
}
}
( void ) inotify_rm_watch( notify_fd, wd );
( void ) close( notify_fd);
exit( 0 );
}
答案 2 :(得分:0)
根据此answer,看来Linux不会监视特定文件。如果要听特定文件,则应先听其父目录。