C++ 使用非阻塞iNotify
我的目标是:监视文本文件进行修改,而不让监视器阻塞我的程序,而是形成循环的一部分(因此按顺序检查) 我的脑袋说:要么找到一种方法在非阻塞模式下运行iNotify,要么找到线程iNotfiy 我尝试了非阻塞方式,并使用以下命令为我的iNotify实例禁用了O_NONBLOCK:C++ 使用非阻塞iNotify,c++,file,monitor,inotify,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); 它不断
fcntl (fd, F_SETFL, fcntl (fd, F_GETFL) | O_NONBLOCK);
但是,当我这样做,然后尝试:
length = read(fd, buffer, BUF_LEN);
它不断告诉我,对于read,资源暂时不可用
有谁能给我一些关于如何实现我想做的事情的建议吗?不需要是这种方法,但我需要的功能,因为我正在编辑一个文本文件与一个Web服务器,并希望阅读修改到我的C++程序,以更新变量。
提前谢谢 EAGAIN
(资源暂时不可用)是当文件描述符设置为非阻塞模式时,如果正在读取的文件描述符上没有可用数据,则预期的错误状态。因为您使用的是轮询循环,所以可以在下一次迭代中再次尝试读取
或者,您可以尝试对文件描述符使用信号驱动的I/O通知:
自Linux 2.6.25以来,信号驱动的I/O通知可用于inotify
文件描述符;参见fcntl(2)
中关于F_SETFL
(设置O_ASYNC
标志)、F_SETOWN
和F_SETSIG
的讨论。传递给信号处理程序的siginfo\u t
结构(如sigaction(2)
所述)设置了以下字段:si\u fd
设置为inotify
文件描述符编号SIU signo
设置为信号号si_code
设置为POLL_IN
;而POLLIN
设置在si_波段