2012-05-23 30 views
0

我的问题是我使用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的inotify,目录[i]为实例[I]含有所在目录的名称。

而且有get_even FUNC的一些代码:

#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”循环停止工作,等待事情的第一个目录发生。我只想检查受监视目录中是否有任何更改,而不是等待更改。

帮助:<

回答

0

呼叫

fcntl(fd, F_SETFL, O_NONBLOCK); 

刚读前(...)函数来强制文件描述符非阻塞模式。

+0

fcntl(fd,F_SETFL,O_NONBLOCK); 工作!非常感谢 :) – wendigu

1

如果你在LINUX/UNIX的时候,你可以使用SELECT来监控新变化多个文件描述符。无论哪个更改先打破阻塞等待,给你更改描述符的编号,让你处理,然后你再监视它。

只要您在呼叫的描述符集内为感兴趣的位置提供所有描述符,它就可以捕获所有更改,而不管它们位于哪个描述符上。

+1

'poll'比select更好,并且就像便携式一样,除非你关心的是15年前没有升级的机器。 –