现在的位置: 首页 > 综合 > 正文

测试 inotify 中 IN_DELETE_SELF

2013年08月10日 ⁄ 综合 ⁄ 共 1333字 ⁄ 字号 评论关闭

// 这篇文章对 IN_DELETE_SELF的理解出错.

前段时间写 inotify 相关的程序, 发现当时间为 IN_DELETE_SELF或 IN_MOVE_SELF 时 event 结构中 name 属性不能 printf.

我觉得不应该, 今天特意写代码测试下.

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

#define BUF_LEN 1024
#define EVENT_NUM 12

static char *event_str[EVENT_NUM] = 
{
	"IN_ACCESS",
	"IN_MODIFY",
	"IN_ATTRIB",
	"IN_CLOSE_WRITE",
	"IN_CLOSE_NOWRITE",
	"IN_OPEN",
	"IN_MOVED_FROM",
	"IN_MOVED_TO",
	"IN_CREATE",
	"IN_DELETE",
	"IN_DELETE_SELF",
	"IN_MOVE_SELF"
};

int main(int argc, char *argv[])
{
	pid_t pid;
	
	if(argc < 2)
	{
		printf("%s dir\n", argv[0]);
		return -1;
	}
	
	pid = fork();
	if(pid == 0)
	{
		sleep(20);
		remove(argv[0]);
		exit(-1);
	}
	else if(pid < 0)
	{
		printf("fork failed\n");
		return -1;
	}
	set_watch(argv[1]);
	return 0;
}

int set_watch(char *dir)
{
	int fd, wd;
	int i;
	char buf[BUF_LEN];
	int len, nread;
	struct inotify_event *event;
	
	if((fd = inotify_init()) == -1)
	{
		printf("inotify_init failed\n");
		return -1;
	}
	wd = inotify_add_watch(fd, dir, IN_ALL_EVENTS);
	if(wd == -1)
	{
		printf("inotify_add_watch %s failed\n", dir);
		return -1;
	}
	
	while((len = read(fd, buf, BUF_LEN)) > 0)
	{
		buf[BUF_LEN-1] = '\0';
		nread = 0;
		while(len)
		{
			event = (struct inotify_event *)&buf[nread];
			for(i=0; i<EVENT_NUM; i++)
			{
				if((event->mask >> i) & 1)
				{
					printf("%s --- %s\n", event->name, event_str[i]);
break;
				}
			}
			nread = nread + sizeof(struct inotify_event) + event->len;
			len = len - (sizeof(struct inotify_event) + event->len);
		}
	}
	
	inotify_rm_watch(fd, wd);
	close(fd);
	return 0;
}

运行程序显示:

      ts_mv_del_self --- IN_DELETE

正常. 看来我以前的代码有问题了.

抱歉!评论已关闭.