参考资料: http://www.ibm.com/developerworks/cn/linux/l-ubuntu-inotify/
先说明一下,上面的参考资料非常好,inotify详细请见上面的参考资料,说几点注意的:inotify对/proc和/sys目录下面的文件不是很有效,也就是说,要监控这两个文件系统下面的文件,请不要使用inotify了,个人意见而已!
下面是监控磁盘插入丢失及时代码:
#define EVENT_SIZE ( sizeof (struct inotify_event) )
#define BUF_LEN ( 1024 * ( EVENT_SIZE + 16 ) )
int main(int argc, char **argv)
{
int length, i = 0, t = 0;
int fd, wd;
char buffer[BUF_LEN];
fd = inotify_init();
if(fd < 0){
perror("inotify_init");
}
wd = inotify_add_watch(fd, "/dev", IN_CREATE | IN_DELETE);
while(1){
length = read(fd, buffer, BUF_LEN);
if(length < 0){
perror( "read" );
}
i = 0;
while(i < length){
struct inotify_event *event = (struct inotify_event *) &buffer[i];
if(event->len && strstr(event->name, "sd")){
if(event->mask & IN_CREATE){
printf(" find the dev: %s /n", event->name);
}else if(event->mask & IN_DELETE){
printf(" lost the dev: %s /n", event->name);
}
}
i += EVENT_SIZE + event->len;
fflush(stdout);
}
}
(void) inotify_rm_watch(fd, wd);
(void) close(fd);
exit(0);
}
值得注意的是,/dev目录,没有udev支持,上面的程序是不可以用的,比如说trustix系统,所以的设备节点,都是预先创建好的,如果有更多的设备时需要自创设备文件,但是现在目前的linux系统都有udev支持,所以上面的程序,一般是通过的;
说白了,判断是否能通用:你看你/dev目录下面的设备文件是不是和你设备对应着的,当插入一个磁盘时,会新增加一个设备文件,如sda之类的;
有个hotplug,似乎也是用inotify实现的,具体请参考如下链接: