2012-01-08 77 views
0

代码应该监视文件系统的变化,但是fstat产生的结果与stat不同,为什么?为什么fstat不等于stat?


struct stat info; 
struct stat finfo; 
char *path = "test"; 
int fd = open(path, O_EVTONLY); 
if (fd <= 0){ 
    exit(-1); 
} 
wait_for_write(fd); 
int err = fstat(fd, &finfo); 
if (err){ 
    exit(-1); 
} 
err = stat(path, &info); 
if (err){ 
    exit(-1); 
} 
if (finfo.st_mtimespec.tv_sec != info.st_mtimespec.tv_sec){ 
    //This happens! 
    exit(-1); 
} 

finfo.st_mtimespec.tv_sec是对应的时间之前写发生和info.st_mtimespec.tv_sec是对应于后

+0

一个功能永远不会与另一个“相等”。 – 2012-01-08 17:15:58

+0

也许是因为涉及到一个符号链接,或者是因为另一个进程正在同一个文件上做某件事...... – 2012-01-08 17:15:58

+0

那么,这两个值之间有什么区别?有什么提示? – 2012-01-08 17:16:22

回答

0

O_EVTONLY缓存连续查询的修改时间。

1

你不应该使用finfo.st_mtimespec.tv_sec,因为它是内部的实现价值的价值;改为使用finfo.st_mtime。 (这不是您'问题'的答案,但它可能会避免将来出现相关问题)

+1

它是在一个OS X特定的实现(由#defines守护),所以我认为它应该没事 – chacham15 2012-01-08 17:22:57

+0

'应该没事'没有理由这样做。看起来像cargocult编程给我。无论如何,.st_mtime有什么问题? – wildplasser 2012-01-08 17:26:04

+0

如果man fstat在osx上,你会看到st_mtime不是stat结构的一部分 – chacham15 2012-01-08 17:29:58