使用inotify进行文件事件通知

来源:互联网 发布:淘宝网童装男童秋装 编辑:程序博客网 时间:2024/06/06 03:04
#include <stdio.h>#include <sys/inotify.h>#include <errno.h>#define MAX_EVENTS  256#define BUFFER_SIZE (MAX_EVENTS * sizeof(struct inotify_event))int register_watchpoint(int fd, char *dir);int watch(int fd);void emit_event(struct inotify_event *ievent);int main(int argc, char *argv[]){    int ifd, err;        if(argc < 2)        return -1;         ifd = inotify_init();        if(ifd < 0)    {           printf("can't init inotify (%d)\n", errno);        return -1;     }           err = register_watchpoint(ifd, argv[1]);    if(err < 0)    {           printf("can't add watch (%d)\n", errno);        return -1;     }           watch(ifd);        close(ifd);    return 0;}nt register_watchpoint(int fd, char *dir){    int err;        err = inotify_add_watch(fd, dir, IN_ALL_EVENTS);    return err;}int watch(int fd){    char ev_buffer[BUFFER_SIZE];    struct inotify_event *ievent;    int len, i;    void emit_event(struct inotify_event *ievent);    while(1)    {        len = read(fd, ev_buffer, BUFFER_SIZE);        if(len < 0)        {            if(errno == EINTR)                continue;        }        i = 0;        while(i < len)        {            ievent = (struct inotify_event *)&ev_buffer[i];            emit_event(ievent);            i += sizeof(struct inotify_event) + ievent->len;        }    }    return 0;}void emit_event(struct inotify_event *ievent){    if(ievent->len)        printf("[%s] ", ievent->name);    if(ievent->mask & IN_ACCESS)        printf("Accessed\n");    if(ievent->mask & IN_MODIFY)        printf("Modified\n");    if(ievent->mask & IN_ATTRIB)        printf("Attributes Changed\n");    if(ievent->mask & IN_CLOSE_WRITE)        printf("Closed (writeable)\n");    if(ievent->mask & IN_CLOSE_NOWRITE)        printf("Closed (unwriteable)\n");    if(ievent->mask & IN_OPEN)        printf("Opened\n");    if(ievent->mask & IN_MOVED_FROM)        printf("File moved from\n");    if(ievent->mask & IN_MOVED_TO)        printf("File moved to\n");    if(ievent->mask & IN_CREATE)        printf("Subfile created\n");    if(ievent->mask & IN_DELETE)        printf("Subfile deleted\n");    if(ievent->mask & IN_DELETE_SELF)        printf("Self deleted\n");    if(ievent->mask & IN_MOVE_SELF)        printf("Self moved\n");    return;}


原创粉丝点击