Это ошибка в функции Linux time () или в вызовах ОС Linux? - PullRequest
3 голосов
/ 10 марта 2010

Я написал небольшую программу, которая создает файлы с интервалом в 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#

Спасибо и всего наилучшего,

Шринивас

Ответы [ 3 ]

2 голосов
/ 10 марта 2010

Во-первых, в вашем коде есть проблема.

  • Удалите open() и write() перед циклом, они ничего не делают.
  • Переместите два вызова close() сразу после вызова write().

Это обеспечит запись данных и закрытие файла, прежде чем вы посмотрите время его изменения с помощью ls. В противном случае между записью () и закрытием () будет задержка в 1 секунду. Поскольку вы пишете только 5 байтов, он будет помещен в буфер. Поэтому, когда вы проверяете время после вызова write (), у вас нет гарантии того, что данные еще были записаны, поэтому файл, возможно, не был изменен, что может испортить результаты.

Во-вторых, вы не можете предполагать задержку в 1 секунду, потому что time() и ls сообщают о разнице в 1 секунду. Поскольку секунда - это ваша самая маленькая единица, вы должны ожидать разницу округления. А поскольку вы используете два разных метода для получения количества секунд с начала эпохи, они могут использовать разные правила округления, что легко приведет к разнице в 1 секунду. Если добавить к этому файловую систему, в которой хранится время модификации, у вас фактически есть три разных участника, которые могут повлиять на ваши результаты.

Кроме того, если вы посмотрите правильно на свой результат, вы увидите, что это time(), который указывает на одну секунду позже ls. Таким образом, у вас совсем нет задержки, вы возвращаетесь во времени! Разница округления является наиболее вероятной причиной этого.

Итак, в функции time () Linux или вызовах ОС Linux нет ошибок.

0 голосов
/ 11 марта 2010
0 голосов
/ 10 марта 2010
  • запись в файл занимает некоторое время.
  • вызов функции time () занимает некоторое время
  • выполнение логики функции time () занимает некоторое время.

все это приводит к задержке в 1 сек .. Это совсем не ошибка!

...