我的问题是我使用inotify来监视多个目录,并使用read()函数来读取任何更改。我的观点是我无法在“同一时间”(“for”循环)中观看所有这些目录,因为read()函数会停止程序直到当前监视目录发生某些事情。
有简化的“主要”代码:
while (1){
for(int i = 0; i < numberOfDirectories; i++){
string fileEnd = get_event(fd[i], catalogs[i]).c_str());
if(string != "") do some code;
}
sleep(1);
}
其中get_event返回更改文件的路径,fd [i]是inotify的实例,catalog [i]包含监视目录的名称。
还有一些get_even函数的代码:
#define BUFF_SIZE ((sizeof(struct inotify_event)+FILENAME_MAX)*1024)
string get_event(int fd, string target)
{
ssize_t len;
char buff[BUFF_SIZE] = {0};
len = read (fd, buff, BUFF_SIZE);
此时主“for”循环停止工作并等到第一个目录中发生某些事情。我想检查一下监视目录是否有任何变化,而不是等待更改。
帮助:&lt;
答案 0 :(得分:1)
如果您在LINUX / UNIX中,则可以使用SELECT监视多个文件描述符以进行新的更改。无论哪个更改首先会破坏阻塞等待,为您提供已更改描述符的编号,让您处理,然后再次监视它。
只要您在调用的描述符集中为您感兴趣的位置提供所有描述符,它就可以捕获任何更改,无论它们处于哪个描述符。
答案 1 :(得分:0)
呼叫
fcntl(fd, F_SETFL, O_NONBLOCK);
在read(...)函数之前,强制您的文件描述符进入非阻塞模式。