7

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

我的脑袋说:要么找到一种方法以非阻塞模式运行 iNotify,要么线程化 iNotfiy。

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

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

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

length = read(fd, buffer, BUF_LEN);

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

谁能给我一些关于如何实现我想做的事情的提示?不需要是这种方法,但我需要该功能,因为我正在使用网络服务器编辑文本文件并希望将修改读入我的 C++ 程序以更新变量。

提前致谢!

4

1 回答 1

5

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

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

从 Linux 2.6.25 开始,信号驱动的 I/O 通知可用于inotify文件描述符;请参阅F_SETFL(用于设置O_ASYNC标志)F_SETOWN、 和F_SETSIG中的讨论fcntl(2)。传递给信号处理程序的siginfo_t结构(在 中描述)设置了以下字段:设置为文件描述符编号;设置为信号编号;设置为;并在 si_band 中设置。sigaction(2)si_fdinotifysi_signosi_codePOLL_INPOLLIN

于 2013-09-03T08:53:49.887 回答