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

本文介绍了一个利用FreeBSD及macOS平台上的kqueue机制来监控文件系统变化的C语言程序示例。该程序能够在文件被修改、删除或属性发生变化时触发相应动作,例如运行指定脚本。不过目前仅能监控当前目录,尚未实现递归监控子目录的功能。
上次写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.
<think>嗯,用户现在遇到了一个Java系统的问题,但具体是什么问题还没说清楚。我得先让他提供更多的细节,比如错误信息、异常堆栈或者具体的场景描述。可能的情况有很多,比如内存泄漏、线程问题、性能瓶颈,或者是某个框架的使用错误。比如,常见的NullPointerException、ConcurrentModificationException,或者是Spring框架中的依赖注入问题。用户可能需要指导如何排查这些问题,或者修复特定的异常。首先,我需要确认用户的问题类型。例如,如果是内存泄漏,可能需要检查对象引用未释放的情况,使用堆转储分析工具。如果是线程问题,可能需要检查同步机制是否正确,有没有死锁的情况。如果是性能问题,可能需要分析代码中的瓶颈,使用Profiler工具。另外,用户可能希望得到具体的代码示例来解决某个问题,比如如何正确使用线程池,或者如何处理数据库连接泄漏。我需要根据用户提供的信息,给出相应的解决方案,并解释问题产生的原因。比如,假设用户遇到了ConcurrentModificationException,这可能是因为在遍历集合的同时修改了它。解决方案可以是使用Iterator的remove方法,或者使用并发集合类如CopyOnWriteArrayList。这时候需要给出代码示例,说明如何正确操作,并解释为什么会出现这个异常。 另外,用户可能对Java8的新特性不太熟悉,比如StreamAPI或Optional的使用,导致代码出现错误。这时候需要提供正确的使用方式,并指出常见的误区。 最后,根据用户的问题,我需要提出一些相关的问题,帮助他深入理解问题所在。例如,如果解决了ConcurrentModificationException,相关问题可能涉及迭代器的使用、并发集合的区别、多线程环境下的集合操作等。 总之,我需要先了解用户的具体问题,然后针对性地提供解决方案和解释,再提出相关的问题引导进一步学习。</think>请提供具体的错误信息、异常堆栈或问题场景描述,我将为您提供详细的解决方案和问题分析。以下是常见问题的解决模式示例: 示例问题:系统出现`java.util.ConcurrentModificationException` 解决方案: ```java // 错误写法 List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c")); for (String s : list) { if (s.equals("b")) { list.remove(s); // 会抛出异常 } } // 正确写法1:使用迭代器 Iterator<String> it = list.iterator(); while (it.hasNext()) { String s = it.next(); if (s.equals("b")) { it.remove(); // 安全删除 } } // 正确写法2:使用并发集合 List<String> safeList = new CopyOnWriteArrayList<>(list); for (String s : safeList) { if (s.equals("b")) { safeList.remove(s); } } ``` 问题原因: 当使用增强for循环遍历集合时,实际上使用的是隐式迭代器。当在遍历过程中直接调用集合的`add/remove`方法修改集合结构时,会导致迭代器的快速失败机制触发,抛出ConcurrentModificationException。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值