请教一个问题 - 监控文件系统变化( C 语言)

本文介绍了一个利用FreeBSD及macOS平台上的kqueue机制来监控文件系统变化的C语言程序示例。该程序能够在文件被修改、删除或属性发生变化时触发相应动作,例如运行指定脚本。不过目前仅能监控当前目录,尚未实现递归监控子目录的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上次写C的代码已经是2年前了, 几乎连main函数怎么写都忘记了.
最近我需要一监控文件系统的, 主要用处就是, 我一保存文件, 就调用一个程序. 通过Google 了好长一段时间. 知道linux 上有个 inotify 的东西. free bsd(mac os) 上有个 kqueue 的东西, windows没看(除了玩儿,我不怎么用它).

sf上 inotify-tools 的项目, 包装了inotify. 用起来不错.

free bsd(mac os) 就没这么幸运了, 只能自己写. 下面的程序基本可以实现, 但问题是只能监控当前目录, 不能监控子目录.

[img]http://nealmi.iteye.com/upload/attachment/50560/04f47ba5-72e4-3efe-9f77-e90b140666f6.png[/img]

[b]伟大的C, 我跟他很是不熟. 希望大家帮帮忙, 指导下如何实现监控子目录,子目录的子目录。

UPDATE:我的想法是遍历所有子目录,在每个目录上同样的操作。

... [/b]


#include <sys/event.h>
#include <sys/time.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>

int main(void){
int f, kq, nev;
struct kevent change;
struct kevent event;

kq = kqueue();
if (kq == -1)
perror("kqueue");

f = open("/Users/abc/test", O_RDONLY);
if (f == -1)
perror("open");

EV_SET(&change, f, EVFILT_VNODE,
EV_ADD | EV_ENABLE | EV_ONESHOT,
NOTE_DELETE | NOTE_EXTEND | NOTE_WRITE | NOTE_ATTRIB,
0, 0);


for (;;) {
nev = kevent(kq, &change, 1, &event, 1, NULL);
if (nev == -1)
perror("kevent");
else if (nev > 0) {
if (event.fflags & NOTE_DELETE) {
printf("File deleted\n");
break;
}
if (event.fflags & NOTE_EXTEND || event.fflags & NOTE_WRITE){
printf("File modified\n");
system("build.sh");
}
if (event.fflags & NOTE_ATTRIB){
printf("File attributes modified\n");
//system(script);
}
}
}

close(kq);
close(f);
return EXIT_SUCCESS;
}



--
I'm a dog chasing cars.

It's Neal Mi.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值