هل هو خطأ في وظيفة وقت Linux () أو مكالمات نظام التشغيل Linux؟

StackOverflow https://stackoverflow.com/questions/2415018

  •  19-09-2019
  •  | 
  •  

سؤال

لقد كتبت برنامجا صغيرا، يقوم بإنشاء ملفات بمثابة فترة 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#

شكرا مع تحياتي،

سرينيفاس

هل كانت مفيدة؟

نصائح أخرى

أولا، هناك مشكلة في التعليمات البرمجية الخاصة بك.

  • مسح ال open() و write() قبل الحلقة، لا يفعلون أي شيء.
  • حرك الاثنين close() اتصل بعد write() المكالمات.

هذا سيضمن أن البيانات مكتوبة وملف مغلقة قبل أن تبدو وقت التعديل الخاص به باستخدام LS. خلاف ذلك، هناك تأخير 1 ثانية بين الكتابة () والإغلاق (). نظرا لأنك تكتب فقط 5 بايت، فسوف يتم تخزينها مؤقتا. لذلك، عندما تقوم بالتحقق من الوقت بعد مكالمة الكتابة ()، ليس لديك أي ضمان أن البيانات قد كتبت بعد، لذلك قد لا يتم تعديل الملف، مما قد يدلي نتائجك.

ثانيا، لا يمكنك تحمل تأخير 1 ثانية ل time() و ls الإبلاغ عن فرق 1 ثانية. منذ الثانية هي أصغر وحدة، يجب أن تتوقع اختلاف التقريب. وبما أنك تستخدم طريقتين مختلفتين للحصول على عدد الثواني منذ العصر، فقد يستخدمون قواعد التقريب المختلفة، والتي ستؤدي بسهولة إلى اختلاف 1 ثانية. إذا أضفنا إلى أنظمة الملفات التي تخزن وقت التعديل، فستكون لديك ثلاثة فاعيم مختلفة قد تؤثر على نتائجك.

أيضا، إذا نظرت بشكل صحيح في ناتك، سترى ذلك time() التي تشير إلى ثانية واحدة ls. وبعد لذلك، ليس لديك تأخير على الإطلاق، فأنت تعود في الوقت المناسب! الفرق التقريب هو السبب الأكثر احتمالا لهذا.

لذلك، لا توجد علة في وظيفة وقت Linux () أو مكالمات نظام التشغيل Linux.

  • الكتابة في ملف يستغرق بعض الوقت.
  • استدعاء وظيفة الوقت () يستغرق بعض الوقت
  • يستغرق تنفيذ المنطق في الوقت الحالي () بعض الوقت.

كل هذا يؤدي إلى تأخير 1 ثانية .. ليس في الإطلاق خطأ!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top