2015-12-03 87 views
2

我的程序需要用户输入并检查是否在一分钟内修改了文件,而不是用户输入。我试图使用stat()函数,如下所示获得文件的最后修改时间:正确使用stat()函数访问m_time的方法

注:op_mmin是以分钟为单位的用户输入

struct stat buf;  
stat(sub_directory, &buf); 

if((time(NULL) - buf.st_mtime) < atoi(op_mmin) * 60) // if the file was modified in less time ago than specified 
{ 
    printf("%d\n", buf.st_mtime); // this print statement simply is used to check what the st_mtime is. 
    printf("%s\n", full_path); // print the full path of the file 
} 

我的代码目前打印像看似随机负数-1036294304-367577248。我刚刚创建了它正在搜索的文件,因此time(NULL) - buf.st_mtime应该比较小。

+3

'buf.st_mtime'是'time_t',但是您将它打印为'int'(使用'%d'格式)。以防万一,使用'%lld'并明确地将其转换为'long long'。 – keltar

回答

4

您将与更好memset(&buf,0,sizeof(buf));明确呼吁stat,你应该检查之前stat(2)成功......所以至少:

struct stat buf; 
memset (&buf, 0, sizeof(buf)); 
if (stat (sub_directory, &buf)) 
    { perror(sub_directory); exit(EXIT_FAILURE); }; 

(由memset清算原则上是无用的;在实践中,初始化或清除每个局部变量对于调试目的是如此有用以使得我总是这样做具有更多可重现的行为;顺便说一句,在这种情况下,编译器会通过内联对memset的调用进行优化,并且清除buf的时间可忽略不计来电任何系统调用,这里stat

那么你应该投time_t差一些long至少:

if((long)(time(NULL) - buf.st_mtime) < atol(op_mmin) * 60) { 
    printf("mtime=%ld, subdir=%s\n", (long) buf.st_mtime, sub_directory); 
} 

你应该花一两天读Advanced Linux Programming,并使用任何syscalls(2)你面前应仔细阅读其文档(并关心其失败)。

也许strace(1)也可能是有用的(至少要了解您的程序正在做什么系统调用)。

当然,你会更好地与gcc -Wall -Wextra -g(许多警告&调试信息)编译和使用gdb调试器(在其中您可能已在stat之前设置一个断点,并逐步运行一些指令step)。如果在Linux(特别是)和本地文件系统(Ext4,BTRFS,...)上运行,您可能会对inotify(7)设施感兴趣。

+0

我在调用'stat'之前没有看到需要调零结构,因为它将由函数填充(当然,如果'stat'返回0) –

+0

@ringø:理论上你是对的;在实践中,这是一个好习惯;我加了一小段解释。 –

相关问题