我的目标:监控文本文件以进行修改,而监视器不会阻止我的程序,而是构成循环的一部分(所以顺序检查)。
我的头说:要么找到一种在非阻塞模式下运行iNotify的方法,要么线程iNotfiy。
我尝试了非阻塞方式,并使用以下命令为我的iNotify实例禁用了O_NONBLOCK:
fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);
但是,当我这样做时,我会尝试:
length = read(fd, buffer, BUF_LEN);
它一直告诉我,对于读取,资源暂时不可用。
任何人都可以给我一些关于如何实现我想做的提示吗?不需要这个方法,但我需要功能,因为我正在使用Web服务器编辑文本文件,并希望读取修改到我的C ++程序中来更新变量。
提前致谢!
答案 0 :(得分:3)
EAGAIN
(资源暂时不可用)是在文件描述符设置为非阻塞模式时,如果在读取文件描述符时没有可用数据,则为预期错误状态。由于您使用的是轮询循环,因此您可以尝试在下一次迭代时再次阅读。
或者,您可以尝试对inotify
文件描述符使用信号驱动的I / O通知:
自Linux 2.6.25起,
inotify
文件描述符可以使用信号驱动的I / O通知;请参阅F_SETFL
中O_ASYNC
(用于设置F_SETOWN
标志),F_SETSIG
和fcntl(2)
的讨论。传递给信号处理程序的siginfo_t
结构(在sigaction(2)
中描述)设置了以下字段:si_fd
设置为inotify
文件描述符编号;si_signo
设置为信号编号;si_code
设置为POLL_IN
;并且POLLIN
在si_band中设置。