您的位置:首页 > 其它

2.6内核支持的inotify

2017-06-13 14:21 190 查看
先上代码:利用inotify函数实现简易的tail命令 不仅可以看文件新增内容 也可以看文件夹下的变化。

#include <stdio.h>//printf
#include <string.h> //strcmp
#include <sys/inotify.h>//inotify_init inotify_add_watch....
#include <sys/select.h>//select timeval
#include <unistd.h>//close
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define EVENT_SIZE  ( sizeof (struct inotify_event) )
#define BUF_LEN     ( 1024 * ( EVENT_SIZE + 16 ) )
#define ERR_EXIT(msg,flag)	{perror(msg);goto flag;}
#define PATH "xiecheng.c"
FILE *fp = NULL;
int fd = 0;
int wd = 0;
void signal_(int signalID)
{
if(signalID == SIGINT)
printf("ctrl c. \n");
inotify_rm_watch( fd, wd );
close( fd );
if(fp > 0)
fclose(fp);
_exit(0);
}
int main( int argc, char **argv )
{
int length, i = 0;

char buffer[BUF_LEN];
long long curFilePointer = 0;
char ch = 0;

signal(SIGINT,signal_);
if(argc < 2)
printf("exe file.\r");

if((fd = inotify_init()) < 0)
ERR_EXIT("inotify_init",inotify_init_err);

if( (wd = inotify_add_watch( fd, argv[1],	IN_MODIFY | IN_CREATE | IN_DELETE ) ) < 0)
{
printf("%s\n",argv[1]);
ERR_EXIT("inofity_add_watch", inotify_add_watch_err);
}
struct stat statbuf;

if (stat(argv[1], &statbuf) == 0)
{
curFilePointer = statbuf.st_size;
fp = fopen(argv[1], "r");
if(fp < 0)
{
ERR_EXIT("fopen", inotify_add_watch_err);
}
fseek(fp,curFilePointer,SEEK_SET);
}

fd_set rfd;
while(true)
{
int retval;
FD_ZERO(&rfd);
FD_SET(fd, &rfd);
retval = select(fd + 1, &rfd, NULL, NULL, NULL);
if(retval == 0) continue;
else if(retval == -1)
ERR_EXIT("select",select_err);

// retval > 0
length = read( fd, buffer, BUF_LEN );
if(length < 0)
ERR_EXIT("read",read_err);

//length >= 0
int i = 0;
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( "The directory %s was created.\n", event->name );
else
printf( "The file %s was created.\n", event->name );
//if(strcmp(event->name,"kill") == 0)
//	ERR_EXIT("success exit",success_exit);

}
else if ( event->mask & IN_DELETE )
{
if ( event->mask & IN_ISDIR )
printf( "The directory %s was deleted.\n", event->name );
else
printf( "The file %s was deleted.\n", event->name );
}
else if ( event->mask & IN_MODIFY )
{
if ( event->mask & IN_ISDIR )
printf( "The directory %s was modified.\n", event->name );
else
{
printf( "The file %s was modified.\n", event->name );
}
}
}
else
{
if ( event->mask & IN_MODIFY )
{
if ( event->mask & IN_ISDIR )
;//printf( "The directory %s was modified.\n", event->name );
else if(fp > 0)
{
fseek(fp,curFilePointer,SEEK_SET);
while ((ch=fgetc(fp))!=EOF)
{
putchar(ch);
curFilePointer++;
}
fflush(stdout);
}
}
}
i += EVENT_SIZE + event->len;
}
}
success_exit:
( void ) inotify_rm_watch( fd, wd );
( void ) close( fd );
if(fp > 0)
fclose(fp);
return 0;
read_err:
select_err:
inotify_add_watch_err:
( void ) inotify_rm_watch( fd, wd );
inotify_init_err:
( void ) close( fd );
return -1;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: