inotify 모니터링 파일 및 폴 더

2265 단어 notify
Liux 에서 inotify 를 이용 하여 파일 과 폴 더 를 모니터링 할 수 있 습 니 다.
상세 한 설명 은 참고 할 수 있다.
http://www.ibm.com/developerworks/cn/linux/l-inotifynew/


주의해 야 할 것 은 inotify 가 읽 은 구조 체 의 마지막 구성원 이 일정 하지 않다 는 것 이다.따라서 이 벤트 를 읽 은 후 강 한 전환 형식 이 필요 합 니 다. 다음은 테스트 코드 입 니 다.
#include<stdio.h>

#include<stdlib.h>

#include<unistd.h>

#include<sys/inotify.h>

char *files[]={

	"t1","t2","t3"

};

struct st_files{

	char *filename;

	int wd;

};

struct st_files file_wd[3];

char * event_array[]={

	"File was accessed",

	"File was modified",

	"File attributes were changed",

	"writtable file closed",

	"unwrittable file closed",

	"File was opened",

	"File was moved from X",

	"File was moved to Y",

	"Subfile was created",

	"Subfile was deleted",

	"Self was deleted",

	"Self was moved",

	"",

	"Backing fs was unmounted",

	"Event queued overflowed",

	"File was ignored"

};

int main(void){

	int fd;

	int wd;

	char buffer[1024];

	char *offset=NULL;

	struct inotify_event *event=NULL;

	int len,tmp_len;

	int i;

	fd=inotify_init();//   inotify  

	for(i=0;i<3;i++){

		wd=inotify_add_watch(fd,files[i],IN_ALL_EVENTS);//               ,        wd

		if(wd<0) perror("inotify_add_watch failed");

		file_wd[i].filename=files[i];

		file_wd[i].wd=wd;

	}

	while(len=read(fd,buffer,1024)){//      ,read   

		offset=buffer;

		printf("some event happens, len = %d.
",len); event=(struct inotify_event *)buffer; while((char *)event-buffer<len){ //offset=buffer; //event=(struct inotify_event*)buffer; for(i=0;i<3;i++){ if(event->wd!=file_wd[i].wd) continue; printf("file %s is %d
",file_wd[i].filename,i); break; } for(i=0;i<16;i++){ if(event_array[i][0]=='\0') continue; if(event->mask&(1<<i)){ printf("%s
",event_array[i]);// } } tmp_len=sizeof(struct inotify_event)+event->len; event=(struct inotify_event*)(offset+tmp_len); offset+=tmp_len; } } return 0; }

좋은 웹페이지 즐겨찾기