使用stat()函数访问m_time的正确方法

时间:2015-12-03 04:16:46

标签: c linux systems-programming

我的程序接受用户输入并检查文件是否在几分钟内被修改而不是用户输入。我试图使用stat()函数获取文件的最后修改时间,如下所示:

注意: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应该相对较小。

1 个答案:

答案 0 :(得分: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原则上是无用的;实际上,初始化或清除每个局部变量对于调试目的非常有用,并且具有更多可重现的行为,我一直在这样做; BTW在这种精确的情况下,编译器会通过内联调用memset进行优化,并且在调用任何系统调用时,清除buf的时间可以忽略不计,{{1} })功能

然后你应该至少对某些stat施加time_t差异:

long

您应该花一两天时间阅读Advanced Linux Programming,在使用任何syscalls(2)之前,您应该仔细阅读其文档(并关注其失败)。

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

当然,您最好使用if((long)(time(NULL) - buf.st_mtime) < atol(op_mmin) * 60) { printf("mtime=%ld, subdir=%s\n", (long) buf.st_mtime, sub_directory); } 编译(许多警告和调试信息)并使用gcc -Wall -Wextra -g调试器(您可能在{{1}之前设置了断点并逐步运行一些说明gdb

BTW,如果在Linux上(特别是)使用本地文件系统(Ext4,BTRFS,...),您可能会对inotify(7)设施感兴趣。