递归遍历目录时C中的gmtime不一致

递归遍历目录时C中的gmtime不一致,c,recursion,time,directory,time-t,C,Recursion,Time,Directory,Time T,我有一个C程序,其中我使用一个遍历目录结构的递归函数。它接受一个time\u t变量并从中创建一个gmtime结构 递归dir函数来自 结构转换的时间在括号中。始终为1534245930或2018年8月14日上午11:25:30,即执行项目时的零下十天 Cutoff: 1534245930 2018-8-14 11:25:30 (1534245930) 2018-8-24 11:25:31 (1534245930) 2018-8-14 11:25:30 (1534245930) 2018-8-2

我有一个C程序,其中我使用一个遍历目录结构的递归函数。它接受一个
time\u t
变量并从中创建一个gmtime结构

递归dir函数来自

结构转换的时间在括号中。始终为
1534245930
或2018年8月14日上午11:25:30,即执行项目时的零下十天

Cutoff: 1534245930
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:31 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:33 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:35 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:38 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:43 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:52 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:54 (1534245930)
2018-8-14 11:25:55 (1534245930)
2018-8-24 11:25:56 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:58 (1534245930)
您可以看到转换非常不一致。几次秒跟随执行时的实际时间。这一天也会改变几次

有人知道或知道这是什么原因吗?我试着做一个简单的循环来转换一个静态的
时间,没有任何问题,所以我只能假设它有一些东西需要仔细阅读

请注意,
gmtime
不是,因为它返回一些静态数据的地址。您需要
gmtime\u r
(因为您的
traversedir
函数是递归的),并且应该使用本地
struct tm

所以

然后
t
将指向上的
mytm
(而不是一些静态数据)

您还应该使用(同样,将足够大的缓冲区声明为自动变量,或者使用一些堆分配的缓冲区)

您可能还对和感兴趣

也请阅读。

仔细阅读,并仔细阅读

请注意,
gmtime
不是,因为它返回一些静态数据的地址。您需要
gmtime\u r
(因为您的
traversedir
函数是递归的),并且应该使用本地
struct tm

所以

然后
t
将指向上的
mytm
(而不是一些静态数据)

您还应该使用(同样,将足够大的缓冲区声明为自动变量,或者使用一些堆分配的缓冲区)

您可能还对和感兴趣


另请阅读。

请参阅与您的时间相关问题非常相关的内容。请参阅与您的时间相关问题非常相关的内容。啊,这很有意义。我确实阅读了gmtime的手册页,但没有明确说明函数是不可重入的(它只讨论了与ctime相关的可重入版本,事后看来,我可能应该假设gmtime也是如此)。只使用nftw进行dir遍历可能更有意义。谢谢但是手册页确实提到了
gmtime\r
,如果
gmtime
是reentrantAh,那么就不需要它了,这是有道理的。我确实阅读了gmtime的手册页,但没有明确说明函数是不可重入的(它只讨论了与ctime相关的可重入版本,事后看来,我可能应该假设gmtime也是如此)。只使用nftw进行dir遍历可能更有意义。谢谢但是手册页确实提到了
gmtime\r
,如果
gmtime
是可重入的,就不需要它了
Cutoff: 1534245930
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:31 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:33 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:35 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:38 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:43 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:52 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:54 (1534245930)
2018-8-14 11:25:55 (1534245930)
2018-8-24 11:25:56 (1534245930)
2018-8-14 11:25:30 (1534245930)
2018-8-24 11:25:58 (1534245930)
struct tm mytm;
struct tm *t = gmtime_r(&cutoff, &mytm);