使用非阻塞iNotify

时间:2013-09-03 08:26:12

标签: c++ file monitor inotify

我的目标:监控文本文件以进行修改,而监视器不会阻止我的程序,而是构成循环的一部分(所以顺序检查)。

我的头说:要么找到一种在非阻塞模式下运行iNotify的方法,要么线程iNotfiy。

我尝试了非阻塞方式,并使用以下命令为我的iNotify实例禁用了O_NONBLOCK:

fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);

但是,当我这样做时,我会尝试:

length = read(fd, buffer, BUF_LEN);

它一直告诉我,对于读取,资源暂时不可用。

任何人都可以给我一些关于如何实现我想做的提示吗?不需要这个方法,但我需要功能,因为我正在使用Web服务器编辑文本文件,并希望读取修改到我的C ++程序中来更新变量。

提前致谢!

1 个答案:

答案 0 :(得分:3)

EAGAIN(资源暂时不可用)是在文件描述符设置为非阻塞模式时,如果在读取文件描述符时没有可用数据,则为预期错误状态。由于您使用的是轮询循环,因此您可以尝试在下一次迭代时再次阅读。

或者,您可以尝试对inotify文件描述符使用信号驱动的I / O通知:

  

自Linux 2.6.25起,inotify文件描述符可以使用信号驱动的I / O通知;请参阅F_SETFLO_ASYNC(用于设置F_SETOWN标志),F_SETSIGfcntl(2)的讨论。传递给信号处理程序的siginfo_t结构(在sigaction(2)中描述)设置了以下字段:si_fd设置为inotify文件描述符编号; si_signo设置为信号编号; si_code设置为POLL_IN;并且POLLIN在si_band中设置。