c语言使用inotify的实例

c/c++ 同时被 2 个专栏收录
7 篇文章 0 订阅
1 篇文章 0 订阅

原文链接:http://www.thegeekstuff.com/2010/04/inotify-c-program-example/

我在上面稍微做了点修改,使得可以监听多个目录,而且可以循环监听,不会监听到一个事件就停止了

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/types.h>
#include <linux/inotify.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define EVENT_BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )

int main( )
{
	int length, i = 0;
	int fd;
	int wd;
	char buffer[EVENT_BUF_LEN];

	/*creating the INOTIFY instance*/
	fd = inotify_init();

	/*checking for error*/
	if (fd < 0) {
		perror("inotify_init");
	}

	/*adding the “/tmp” directory into watch list. Here, the suggestion is to validate the existence of the directory before adding into monitoring list.*/
	wd = inotify_add_watch(fd, "/tmp", IN_CREATE | IN_DELETE);
	inotify_add_watch(fd, "/tmp/dir1", IN_CREATE | IN_DELETE);  //添加了一个子目录进行监听,默认是不会监听子目录的
	/*read to determine the event change happens on “/tmp” directory. Actually this read blocks until the change event occurs*/

	for ( ; ;)  // 在外面加了一个循环,防止监听完一个事件后就退出了
	{
		i = 0;
		length = read(fd, buffer, EVENT_BUF_LEN);

		/*checking for error*/
		if (length < 0) {
			perror("read");
		}

		/*actually read return the list of change events happens. Here, read the change event one by one and process it accordingly.*/
		while (i < length) {
			struct inotify_event *event = (struct inotify_event *) &buffer[i];
			if (event->len) {
				if (event->mask & IN_CREATE) {
					if (event->mask & IN_ISDIR) {
						printf("New directory %s created.\n", event->name);
					} else {
						printf("New file %s created.\n", event->name);
					}
				} else if (event->mask & IN_DELETE) {
					if (event->mask & IN_ISDIR) {
						printf("Directory %s deleted.\n", event->name);
					} else {
						printf("File %s deleted.\n", event->name);
					}
				}
			}
			i += EVENT_SIZE + event->len;
		}

	}
	/*removing the “/tmp” directory from the watch list.*/
	inotify_rm_watch(fd, wd);
	/*closing the INOTIFY instance*/
	close(fd);
	return 0;
}


  • 2
    点赞
  • 3
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值