2014-07-08 45 views
2

我需要注意基于Unix系统上文件的修改,并且我无法访问Boost。我想知道下面的逻辑是否正确。我认为这可能是低效率的,而且我知道我在while循环中根本没有睡觉而浪费了大量的周期,但是我没有估计文件在修改之间需要多长时间,我需要知道相对较快:比较文件统计时间

std::time_t getTimeLastModified(const char* filename){ 

    struct stat fileattrib; 
    stat(filename, &fileattrib); 

    return fileattrib.st_mtime; 
} 

int main(){ 

    std::time_t file1_modified_time = getTimeLastModified(coor_file.c_str()); 

    while(difftime(getTimeLastModified(coor_file.c_str()),file1_modified_time)==0){} 

    // If program execution gets here, file has been modified 
} 
+3

为什么不使用'inotify'如果你的内核可用? –

+0

inotify在我工作的生产系统上不可用。我无法在此系统上重新编译内核,也无法在系统上进行root访问。 – cooper

回答

3

用于检查mod时间的逻辑主要是声音。

您只需要错误检查统计返回值 - 以防文件丢失。

struct stat fileattrib; 
int status = stat(filename, &fileattrib); // Get file stats 
if (status < 0) 
    return((std::time_t)-1); // File missing? 
return(fileattrib.st_mtime); 

这将意味着你应该错误检查getTimeLastModified()返回 值。

如果您碰巧知道需要多长时间来轮询修改文件 修改时间,可以在 while循环中调用usleep(unsinged long usec)。你能做这样的事吗?

const unsigned long polltime = 5000; // 5ms 
usleep(polltime); 

要考虑的另一件事是是否超时。也就是说,如果文件永不改变 - 例如10分钟(或600000000微秒),你会怎么做 。