首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
详解Linux 2.6内核新文件系统变化机制
来源:www.unix5.com 作者:riechelr_hl(收集) 发布时间:2007-06-06  

_syscall3(int, inotify_add_watch,

int, fd, const char *, path,

__u32, mask) _syscall2(int,

inotify_rm_watch, int, fd,

__u32, mask) char * monitored_files[] =

{ "./tmp_file", "./tmp_dir",

"/mnt/sda3/windows_file" };

struct wd_name { int wd;

char * name; }; #define

WD_NUM 3 struct wd_name wd_array[WD_NUM];

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" };

#define EVENT_NUM 16 #define

MAX_BUF_SIZE 1024 int main(void)

{ int fd; int wd; char buffer[1024];

char * offset = NULL; struct inotify_event

* event; int len, tmp_len; char strbuf[16];

int i = 0; fd = inotify_init();

if (fd < 0) { printf("Fail to

initialize inotify.\n"); exit(-1);

} for (i=0; i wd_array[i].name = monitored_files[i];

wd = inotify_add_watch(fd, wd_array[i].name,

IN_ALL_EVENTS); if (wd < 0) {

printf("Can't add watch for %s.\n",

wd_array[i].name); exit(-1);

} wd_array[i].wd = wd; }

while(len = read(fd, buffer,

MAX_BUF_SIZE)) { offset = buffer;

printf("Some event happens,

len = %d.\n", len); event =

(struct inotify_event *)buffer;

while (((char *)event - buffer)

< len) { if (event->mask & IN_ISDIR)

{ memcpy(strbuf, "Direcotory", 11);

} else { memcpy(strbuf, "File",

5); } printf("Object type: %s\n",

strbuf); for (i=0; i if (event->wd != wd_array[i].wd) continue;

printf("Object name: %s\n", wd_array[i].name);

break; } printf("Event mask:

%08X\n", event->mask); for (i=0;

i[0] == '\0') continue; if (event->mask

& (1<event_array[i]); } } tmp_len

= sizeof(struct inotify_event) + event->len;

event = (struct inotify_event *)(offset

+ tmp_len); offset += tmp_len; } }

}


该程序把监视发生在当前目录下的文件 tmp_file 与当前目录下的目录 tmp_dir 上的所有文件系统事件, 同时它也把监视发生在文件 /mnt/sda3/windows_file 上的文件系统事件,注意,/mnt/sda3 是 SATA 硬盘分区 3 的挂接点。

 

  细心的读者可能注意到,该程序首部使用 _syscallN 来声明 inotify 系统调用,原因是这些系统调用是在最新的稳定内核 2.6.13 中引入的,glibc 并没有实现这些系统调用的库函数版本,因此,为了能在程序中使用这些系统调用,必须通过 _syscallN 来声明这些新的系统,其中的 N 为要声明的系统调用实际的参数数。还有需要注意的地方是系统的头文件必须与被启动的内核匹配,为了让上面的程序能够成功编译,必须让 2.6.13 的内核头文件(包括 include/linux/*, include/asm/* 和 include/asm-generic/*)在头文件搜索路径内,并且是第一优先搜索的头文件路径,因为 _syscallN 需要用到这些头文件中的 linux/unistd.h 和 asm/unistd.h,它们包含了 inotify 的三个系统调用的系统调用号 __NR_inotify_init、__NR_inotify_add_watch 和 __NR_inotify_rm_watch。

共5页: 上一页 [1] [2] [3] 4 [5] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux 2.6.11内核文件IO系统调用
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·Linux系统可卸载内核模块完全指
·Linux系统内核模块和驱动的编写
·Linux系统可卸载内核模块完全指
·Linux系统可卸载内核模块完全指
·内核设计篇
·Linux内核对I/O端口的管理实现(
·Linux 和对称多处理
·Linux内核对I/O端口的管理实现(
·使用 SystemTap 调试内核
·使用 Linux 系统调用的内核命令
·Linux操作系统的源代码目录树结
·浅谈关于Linux系统内核的源代码

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!