我想inotify
在Linux上使用该机制.我希望我的应用程序知道文件何时aaa
被更改.你能告诉我一些如何做到的样品吗?
jos*_*chi 30
在inotify
C API
inotify
提供三个系统调用来构建各种文件系统监视器:
inotify_init()
inotify
在内核中创建子系统的实例,并在成功和-1
失败时返回文件描述符.与其他系统调用一样,如果inotify_init()
失败,请检查errno
诊断.inotify_add_watch()
顾名思义,它增加了一块手表.每个监视必须提供路径名和相关事件列表,其中每个事件由常量指定,例如IN_MODIFY
.要监视多个事件,只需在每个事件之间使用C-中的逻辑或管道(|)运算符.如果inotify_add_watch()
成功,则呼叫返回已注册监视的唯一标识符; 否则,它返回-1
.使用标识符可以更改或删除关联的监视. inotify_rm_watch()
删除手表.在read()
和close()
还需要系统调用.给定描述符inotify_init()
,调用read()
等待警报.假设一个典型的文件描述符,应用程序阻止接收事件,这些事件表示为流中的数据.文件描述符上的公共close()产生了inotify_init()
删除并释放所有活动监视以及与inotify实例关联的所有内存.(典型的引用计数警告也适用于此.与实例关联的所有文件描述符必须在手表消耗的内存和inotify被释放之前关闭.)
Run Code Online (Sandbox Code Playgroud)#include "inotify.h" #include "inotify-syscalls.h" int wd; wd = inotify_add_watch (fd, "/home/rlove/Desktop", IN_MODIFY | IN_CREATE | IN_DELETE); if (wd < 0) perror ("inotify_add_watch");
此示例在目录/ home/rlove/Desktop上添加一个监视,用于任何修改,文件创建或文件删除.
Fab*_*ian 12
下面是一个如何使用inotify观看"aaa"的片段.请注意,我没有测试过这个,我甚至没有编译过它!您需要为其添加错误检查.
您也可以在inotfd上使用poll/select,而不是使用阻塞读取.
const char *filename = "aaa";
int inotfd = inotify_init();
int watch_desc = inotify_add_watch(inotfd, filename, IN_MODIFY);
size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = malloc(bufsiz);
/* wait for an event to occur */
read(inotfd, event, bufsiz);
/* process event struct here */
Run Code Online (Sandbox Code Playgroud)
如果您只需要一个命令行应用程序,那么有一个名为的命令行应用程序inotifywait
可以使用inotify
从1号航站楼出发
# touch cheese
# while inotifywait -e modify cheese; do
> echo someone touched my cheese
> done
Run Code Online (Sandbox Code Playgroud)
从2号航站楼
echo lol >> cheese
Run Code Online (Sandbox Code Playgroud)
这是在1号航站楼上看到的
Setting up watches.
Watches established.
cheese MODIFY
someone touched my cheese
Setting up watches.
Watches established.
Run Code Online (Sandbox Code Playgroud)
更新:谨慎使用并查看评论。
归档时间: |
|
查看次数: |
64171 次 |
最近记录: |