我的程序需要用户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_mtime
search的文件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)设施。