由于 read() 块而无法监视多个目录
Can't watch multiple directories because of read() block
我的问题是我使用 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(...) 函数之前,强制文件描述符进入非阻塞模式。
相关文章:
- 正在VS调试器中监视映射条目
- 使用 ImageIO.read() 生成的图像是否仍然使用传递给它的相同内存?
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- write() 和 read() 中几乎没有混淆
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- 为什么调试器引发"read access violation. this was nullptr"异常?
- 对同一文件使用 .read 的次数是否有限制?
- Win32 API - HWND "{unused = ???} Unable to read memory"错误
- 为什么我会"Invalid read of size 8"?(瓦尔格林德)
- QDataStream read to QVector
- asio::read() 需要很长时间,使用 asio::write 没有问题
- Read OpenCV Mat 16bit to QImage 8bit Greyscale
- 如果 I/O read() 处于阻塞阶段,如何使用 Ctrl+C 退出 C++ 程序?
- 如何将 (serverClients[i].read() 传递给 ESP8266 上的字节数组
- 将 Lora.read() 转储到数组
- 如何删除由 ReadDirectoryChangesW 监视的子项的父项
- 无法通过 FUSE 文件系统"read"任何内容
- 指向 std::unrodered_map 中元素的指针返回'Read access violation'
- 由于 read() 块而无法监视多个目录