linux中inotify机制如何应用

在前面的博客《用可变参数扩展printf》中讨论到如何在应用中控制log的输出。
我们假设的情景是,一个长期运行的Linux程序,想在不退出运行的情况下,通过某种机制,可以让程序知道要不要打印出log 。
我们当时的实现是:

  1. 创建一个文件,写进标志位
  2. 然后每次要打印log之前先读取这个文件,按照标志位是什么来决定要不要打印log

这样子我们在linux系统上,如果不想打印出这些log,可以向这个文件写其他标志位。
但是,这种做法效率太低了。那如何解决上面的问题呢?
有两种做法:

  1. 一种是linux inotify机制
  2. 另外一种是linux 信号机制。注册一个信号,文件更改了,向这个程序发信号,printf_my_log再重新读取。

在本节中,讲的是linux inotify机制。

参考资料http://www.man7.org/linux/man-pages/man7/inotify.7.html
Inotify机制作用:

  1. Inotify 是一个 Linux特性,它监控文件系统操作,比如读取、写入和创建。
  2. Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙轮询高效得多。

inotify既可以监控文件,也可以监控目录。这里我们用来监视文件printlog。

下面讲一下如何在程序中使用Inotify机制。
第一步是创建 inotify 实例。
  int fd = inotify_init ();
  也可以用inotifyFd = inotify_init1(IN_NONBLOCK) 实现非阻塞
  每一个 inotify 实例对应一个独立的排序的队列。
第二步是添加需要被监视的文件。
  下面函数用于添加一个 watch:
  参数含义:
  fd : inotify_init() 返回的文件描述符
  path :被监视的目标的路径名(即文件名或目录名)
  mask: 是事件掩码
  int wd = inotify_add_watch (fd, path, mask);
第三步是读取inotify_event 数据到buf。
  numRead = read(inotifyFd,buf,BUF_LEN); //读取不到会阻塞
第四步是解析读取的数据,一般是根据inotify_event结构中的mask成员来判断的。

for(p=buf;p < buf+numRead;p+=sizeof(struct inotify_event) + event->len)  
{  
    event = (struct inotify_event *)p;  
    if(event->mask & IN_ACCESS)   printf("IN_ACCESS\n");  
    if(event->mask & IN_DELETE_SELF)   printf("DELETE_SELF\n");  
    if(event->mask & IN_MODIFY)    printf("IN_MODIFY\n");
    if(
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值