这是Linux时间()函数或Linux操作系统调用中的错误吗?

我写了一个小程序,每隔1分钟创build一个文件。 但是,文件创build和上次写入的时间以及ls命令所显示的文件的最后修改时间相差1秒。 代码和输出如下所示。 请让我知道哪里可能是错误?

root@new:/home/srinivas# cat bc #include <time.h> #include <stdio.h> #include <sys/stat.h> #include <dirent.h> #include <fcntl.h> int main () { int fd; int i=0; time_t initial_time = time(NULL); time_t interval = 60; time_t curr_time = time(NULL); fd=open ("test1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); write(fd,"abcd1",5); while(1) { curr_time = time(NULL); if(curr_time >= initial_time) { if(i==0) { close(fd); printf("\ntime before test2.txt fileopen= %d\n", time(NULL)); fd=open ("test2.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); write(fd,"abcd2",5); printf("time after test2.txt filewrite= %d\n", time(NULL)); system("ls -l --time-style=+%s test2.txt"); initial_time += interval; i=1; } else { close(fd); printf("\ntime before test1.txt fileopen= %d\n", time(NULL)); fd=open ("test1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666); write(fd,"abcd1",5); printf("time after test1.txt filewrite= %d\n", time(NULL)); system("ls -l --time-style=+%s test1.txt"); initial_time += interval; i=0; } } usleep(1000); } return 0; } root@new:/home/srinivas# gcc bc root@new:/home/srinivas# ./a.out time before test2.txt fileopen= 1268203133 time after test2.txt filewrite= 1268203133 -rw-r--r-- 1 root root 5 1268203133 test2.txt time before test1.txt fileopen= 1268203193 time after test1.txt filewrite= 1268203193 -rw-r--r-- 1 root root 5 1268203192 test1.txt time before test2.txt fileopen= 1268203253 time after test2.txt filewrite= 1268203253 -rw-r--r-- 1 root root 5 1268203252 test2.txt time before test1.txt fileopen= 1268203313 time after test1.txt filewrite= 1268203313 -rw-r--r-- 1 root root 5 1268203312 test1.txt time before test2.txt fileopen= 1268203373 time after test2.txt filewrite= 1268203373 -rw-r--r-- 1 root root 5 1268203372 test2.txt root@new:/home/srinivas# ls -ltr --time-style=+%s total 40 -rwxrwxrwx 1 root root 1095 1268202457 bc -rwxr-xr-x 1 root root 10300 1268202459 a.out -rw-r--r-- 1 root root 5 1268203312 test1.txt -rw-r--r-- 1 root root 5 1268203372 test2.txt root@new:/home/srinivas# 

感谢致敬,

SRINIVAS

首先,你的代码有问题。

  • 在循环之前删除open()write() ,它们没有做任何事情。
  • write()调用之后移动两个close() write()调用。

这将确保在使用ls查看其修改时间之前写入数据并关闭文件。 否则,write()和close()之间会有1秒的延迟。 由于你只写了5个字节,它将被缓冲。 因此,在write()调用之后检查时间时,您不能保证数据已经写入,所以文件可能没有被修改,这可能会导致您的结果。

其次,你不能假设1秒的延迟,因为time()ls报告1秒的差异。 由于第二个是你最小的单位,你应该期望舍入差异。 而且由于您使用两种不同的方法来获取自Epoch以来的秒数,他们可能会使用不同的舍入规则,这很容易导致1秒的差异。 如果我们添加到存储修改时间的文件系统,实际上有三个不同的角色可能会影响您的结果。

另外,如果你正确地看你的结果,你会看到它的time() ,表示比ls晚一秒。 所以,你根本不会有任何的延迟,你会回到过去! 四舍五入的差异是最可能的原因。

所以,Linux的时间()函数或Linux操作系统调用中没有任何错误。

  • 写入文件需要一些时间。
  • 调用time()函数需要一些时间
  • time()函数的逻辑执行需要一些时间。

所有这一切都导致了1秒的延迟..它根本不是一个错误!