Linux Time () 함수 또는 Linux OS 호출의 버그입니까?
문제
나는 작은 프로그램을 작성하여 1 분 간격으로 파일을 만듭니다. 그러나 파일이 생성되고 마지막으로 작성된 시간과 LS 명령에 표시된 파일의 마지막 수정 시간은 1 초가 다릅니다. 코드와 출력은 다음과 같습니다. 버그가 어디에 있는지 알려주세요?
root@new:/home/srinivas# cat b.c
#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 b.c
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 b.c
-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()
루프 전에 그들은 아무것도하지 않습니다. - 둘을 움직입니다
close()
바로 직후에 전화하십시오write()
전화.
LS를 사용하여 수정 시간을보기 전에 데이터가 작성되고 파일이 닫히도록합니다. 그렇지 않으면 쓰기 ()과 close () 사이에 1 초 지연이 있습니다. 5 바이트 만 쓰기 때문에 버퍼링됩니다. 따라서 write () 호출 후 시간을 확인할 때 데이터가 아직 작성되었음을 보장 할 수 없으므로 파일이 수정되지 않았으므로 결과를 망칠 수 있습니다.
둘째, 1 초 지연을 가정 할 수 없습니다. time()
그리고 ls
1 초의 차이를보고하십시오. 두 번째는 가장 작은 단위이므로 반올림 차이를 기대해야합니다. 그리고 Epoch 이후 몇 초를 얻기 위해 두 가지 다른 방법을 사용하고 있기 때문에 다른 반올림 규칙을 사용할 수 있으므로 1 초의 차이가 쉽게 발생할 수 있습니다. 수정 시간을 저장하는 파일 시스템을 추가하면 실제로 결과에 영향을 줄 수있는 세 가지 다른 행위자가 있습니다.
또한 결과를 올바르게 보면 time()
이는 1 초 후에 1 초를 나타냅니다 ls
. 따라서 전혀 지연이 없습니다. 시간을 거슬러 올라갑니다! 반올림 차이는 이것의 가장 가능한 이유입니다.
따라서 Linux Time () 함수 또는 Linux OS 호출에는 버그가 없습니다.
- 파일로 작성하는 데 시간이 걸립니다.
- 시간 () 함수로 호출 시간이 걸립니다.
- 시간 () 함수의 논리 실행은 시간이 걸립니다.
이 모든 것은 1 초 지연을 초래합니다. 전혀 버그가 아닙니다!