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

我的程序需要用户input并检查文件是否在一分钟内被修改,而不是用户input。 我正在尝试使用stat()函数获取文件的最后修改时间,如下所示:

注意:op_mmin是以分钟为单位的用户input

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 。 我只是创build了这么time(NULL) - buf.st_mtimesearch的文件time(NULL) - buf.st_mtime应该是相对较小的。

你最好用memset(&buf,0,sizeof(buf));清除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); } 

你应该花一两天读高级Linux编程 ,在使用任何系统调用之前(2)你应该仔细阅读它的文档(并且关心它的失败)。

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

当然,你最好使用gcc -Wall -Wextra -g (许多警告和调试信息)进行编译,并使用gdb调试器(可能在stat之前设置了断点并step运行一些指令)。

顺便说一句,如果在Linux(特别是)与本地文件系统(Ext4,BTRFS,…)你可能会感兴趣inotify(7)设施。