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

Proper way to use stat() function to access m_time

我的程序接受用户输入并检查文件是否在用户输入的几分钟内被修改。我正在尝试使用 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 应该相对较小。

你最好在调用 stat 之前用 memset(&buf,0,sizeof(buf)); 清除,你应该检查 stat(2) 是否成功...所以至少:

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

memset 的清除原则上是无用的;在实践中,初始化或清除每个局部变量对于调试目的非常有帮助,并且具有我一直在做的更多可重现的行为那;顺便说一句,在这种情况下,编译器将通过内联对 memset 的调用进行优化,并且清除 buf 的时间可以忽略不计 w.r.t。对 any[ 的调用=44=]系统调用,这里是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, and before using any syscalls(2)你应该仔细阅读它的文档(并关心它的失败)。

也许 strace(1) 也可能有用(至少了解您的程序正在执行的系统调用)。

当然,你最好用gcc -Wall -Wextra -g编译(很多警告和调试信息)并使用gdb调试器(你可能在[=13=之前设置了一个断点) ] 和 运行 一些说明 step 一步一步)。

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