2.6内核支持的inotify

先上代码:利用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;
}

  

时间: 2024-10-30 16:16:06

2.6内核支持的inotify的相关文章

操作系统--内核支持线程和用户级线程

内核支持线程(Kernel Supported threads)KST OS中的所有进程(用户和内核)都是依靠内核完成的.KST也是如此,它的创建,阻塞,撤销,切换都是在内核空间实现. 优点: 内核可以同时调度同一进程中的多个线程并行执行 一个线程被阻塞了,内核可以调度随便一个进程中的其他线程占用处理器 采用多线程技术,可以提高西永的执行速度 用户级线程ULT 在用户空间实现,它的创建,阻塞,撤销,切换都无需内核的支持-->用户级线程与内核无关.所以内核完全不知道用户级线程的存在,也就不能看到用

配置内核支持NFS启动文件系统

内核支持NFS分区(即编译时在File system中选中[*] Root file system on NFS), 以及支持内核IP_PNP(即编译时在Networking中选中[*] IP: kernel level autoconfiguration) File systems  ---> Network File Systems  ---> <*> NFS file system support                        ## 必选 [*]   Prov

线程的实现方式之内核支持线程和用户级线程

线程是OS进行独立调试.执行的基本单位,进程是系统进行资源分配的基本单位,一个进程可以包含若干个线程.无论是系统进程还是用户进程,进程的创建.撤消.以及要求系统设备完成的IO操作,都是利用系统调用而进入内核,再由内核中相应处理程序予以完成.进程的切换同样是在内核的支持下实现的.即不论什么样的进程,它们都是在OS内核的支持下运行的,是与内核紧密相关的. 1. 线程的分类 线程根据其实现方式不同又可分为内核支持线程KST(Kernel Supported Threads).用户级线程ULT(User

Centos7.1 下升级内核支持aufs模块

1.查看linux内核版本及是否支持aufs模块: [16:45:31 [email protected] ~]# uname -r 3.10.0-229.el7.x86_64 [16:46:45 [email protected] ~]# grep aufs /etc/filesystems 2.下载带aufs模块的3.10内核 从这个站点http://down.51cto.com/data/1903250下载以下两个文件,并上传到虚机上 kernel-ml-aufs-3.10.5-3.el6

1-18 编译安装内核支持ntfs文件系统

大纲: 源码编译Linux内核 使用Linux内核模块 实战:编译一个NTFS内核模块,实现Linux挂载NTFS文件系统并实现读写功能 =================================================================== 一.源码编译Linux内核 通常我们想对内核进行升级时,可通过下载源码包,编译内核的方式,对内核进行升级 源码包的下载地址在:www.kernel.org 我们可以直接在linux系统中直接下载,如下命令: wget http

linux内核支持U-disk和U转串

配置内核 make menuconfig,选中device驱动 Device Drivers ---->USB support--->USB Serial Converter support----> (1)USB Generic Serial Driver. (2)USB FTDI Single Port Serial Driver.(FTDI芯片驱动) (3)USB Prolific 2303 Single Port Serial Driver.(PL2303芯片驱动) Device

内核增加支持yaffs2错误问题汇总

Q1: fs/yaffs2/yaffs_mtdif2.c:xxx: error: 'struct xxx1' has no member named 'fun_xxx' A1:比对fun_xxx和struct中fun_xxx名字是否相同 有一个版本是修改以下文档 诸如此类问题: vi fs/yaffs2/yaffs_vfs.c +2514 vi fs/yaffs2/yaffs_vfs.c +2702 vi fs/yaffs2/yaffs_vfs.c +2708 vi fs/yaffs2/yaff

s3c2440 移植linux内核 添加网卡支持 yaffs2文件系统支持

三.内核的移植 说明:针对的是百问网的jz2440 gcc:4.9.1 1.移植内核 首先,下载源码包:https://www.kernel.org/ 现在时间为2014年12月20日其主界面截图为: 在此,就在下较新的稳定的版本作为尝试.在这里有个命名问题需要说明一下,最前面的2.6或者3.18是主版本号码,后面的次版本号是比如2.6.32.65中的32,再后面的比如2.6.32.65中的65是升级版本号,主版本号为奇数的是开发本比如3.17,主版本号为偶数的为稳定版比如3.18,一般情况下名

解决三星官方移植的内核默认是没有打开支持V4L USB devices

在linux比较新的kernel,都标配了各类摄像头的驱动支持,不用我们自己移植驱动,只需通过make menuconfig配置内核支持我们所需的摄像头类型即可.以下是在三星官方内核中配置V4L类型摄像头的方法. 三星官方的内核默认是没有V4L USB devices 这个选项的,但是实际是只是被[屏蔽了] 1.通过 grep "V4L USB devices" -r -n   得到以下信息: arch/ia64/configs/zx1_defconfig:909:# V4L USB