由于 read() 块而无法监视多个目录

Can't watch multiple directories because of read() block

本文关键字:监视 read 由于      更新时间:2023-10-16

我的问题是我使用 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 的实例,目录 [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"循环停止工作并等待第一个目录中发生某些事情。我只想检查监视目录中是否有任何更改,而不是等待更改。

帮助 :<</p>

如果您使用的是 LINUX/UNIX,则可以使用 SELECT 来监视多个文件描述符的新更改。 无论哪个更改首先都会中断阻塞等待,为您提供更改的描述符的编号,让您处理,然后您只需再次监视它。

它允许你捕获任何更改,无论它们位于哪个描述符上,只要你在调用的描述符集中提供你感兴趣的位置的所有描述符。

调用

fcntl(fd, F_SETFL, O_NONBLOCK);

就在 read(...) 函数之前,强制文件描述符进入非阻塞模式。