我自闲庭信步,悠然自得,不亦乐乎.

                                       ------ Keep life simple
GMail/GTalk/MSN:huyi.zg@gmail.com

 

Linux下获取文件变更通知

文章是在网上搜到的,我只是截取了其中一段。

#define _GNU_SOURCE /* needed to get the defines */ 
#include 
/* in glibc 2.2 this has the needed 
values defined 
*/
 
#include 
#include 
#include 

static volatile int event_fd; 

// 信号处理例程 
static void handler(int sig, siginfo_t *si, void *data) 

event_fd 
= si->si_fd; 
}
 

int main(void

struct sigaction act; 
int fd; 

// 登记信号处理例程 
act.sa_sigaction = handler; 
sigemptyset(
&act.sa_mask); 
act.sa_flags 
= SA_SIGINFO; 
sigaction(SIGRTMIN, 
&act, NULL); 

// 需要了解当前目录"."的情况 
fd = open(".", O_RDONLY); 
fcntl(fd, F_SETSIG, SIGRTMIN); 
fcntl(fd, F_NOTIFY, DN_MODIFY
|DN_CREATE|DN_MULTISHOT); 
/* we will now be notified if any of the files 
in "." is modified or new files are created 
*/
 
while (1
// 收到信号后,就会执行信号处理例程。 
// 而 pause() 也就结束了。 
pause(); 
printf(
"Got event on fd=%d\n", event_fd); 
}
 
}
 

上面这一小段例程,对于熟悉 Linux 系统编程的读者朋友们来说,是很容易理解的。程序首先注册一个信号处理例程,然后通知 Kernel,我要观察 fd 上的 DN_MODIFY 和 DN_CREATE 和 DN_MULTISHOT 事件。(关于这些事件的详细定义,请读者朋友们参阅文后所列的参考资料。) Linux Kernel 收到这个请求后,把相应的 fd 的 inode 给做上记号,然后 Linux Kernel 和用户应用程序就自顾自去处理各自的别的事情去了。等到 inode 上发生了相应的事件,Linux Kernel 就把信号发给用户进程,于是开始执行信号处理例程,用户程序对文件系统上的变化也就可以及时的做出反应了。而在这整个过程中,系统以及用户程序的正常运行基本上未受到性能上的影响。这里还需要说明的是,dnotify 并没有通过增加新的系统调用来完成它的功能,而是通过 fcntl 来完成任务的。增加一个系统调用,相对来说是一个很大的手术,而且如果设计不当,处理得不好的话,伤疤会一直留在那里,这是 Linux Kernel 的开发者们所非常不愿意见到的事情。

 

posted on 2006-04-13 13:35 HuYi 阅读(841) 评论(2)  编辑 收藏 引用 所属分类: UNIX/Linux

评论

# re: Linux下获取文件变更通知 2006-04-13 21:19 Stone Jiang

真不错,
Windows下怎么实现呢?
  回复  更多评论   

# re: Linux下获取文件变更通知 2006-04-13 21:22 Stone Jiang

ACE下可以实现Windows监视文件和目录的变更  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(12)

随笔分类

相册

收藏夹

友情链接

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜