Linux开发--inotify事件机制

    Inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。
    在BSD和Mac OS系统中比较有名的是kqueue,它可以高效地实时跟踪Linux文件系统的变化。
近些年来,以fsnotify作为后端,几乎所有的主流Linux发行版都支持Inotify机制。
    如何知道你的Linux内核是否支持Inotify机制呢?很简单,执行下面这条命令:
        grep -r INOTIFY_USER /boot/

    如果输出"CONFIG_INOTIFY_USER=y",便可以使用inotify机制。

    下面代码展示了利用inotify对/etc/目录下文件读写进行监控:

#include <sys/inotify.h>
#include <unistd.h>
#include <stdio.h>

#define NAME_MAX 100
#define BUF_LEN (10 * sizeof(struct inotify_event) + NAME_MAX +1)

int get_inotify()
{
	int fd;
	fd = inotify_init();
	if (fd == -1)
	{
		perror("inotify_init");
		return -1;
		// exit (EXIT_FAILURE);
	}

	int wd;
	wd = inotify_add_watch(fd, "/etc/, IN_ACCESS | IN_MODIFY);

	if (wd == -1)
	{
		perror ("inotify_add_watch");
		return -1;
		// exit (EXIT_FAILURE);
	}

	char buf[BUF_LEN] __attribute__((aligned(4)));

	while(1)
	{
		ssize_t len, i = 0;

		/* read BUF_LEN bytes’ worth of events */
		len = read (fd, buf, BUF_LEN);

		/* loop over every read event until none remain */
		while (i < len)
		{
			struct inotify_event *event = (struct inotify_event *) &buf[i];

			printf("wd=%d mask=%d cookie=%d len=%d dir=%s\n",
				event->wd, event->mask, event->cookie, event->len, (event->mask & IN_ISDIR) ? "yes" : "no");

			/* if there is a name, print it */
			if (event->len)
			{
				printf ("name=%s\n", event->name);
			}

			/* update the index to the start of the next event */
			i += sizeof(struct inotify_event) + event->len;
		}

	}

	return 0;
}

int main(int argc, char const *argv[])
{
	/* code */
	get_inotify();
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值