문제

나는 작은 프로그램을 작성하여 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 초 지연을 초래합니다. 전혀 버그가 아닙니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top