getitimer(2)

الاسم
getitimer, setitimer - الحصول أو تعيين قيمة مؤقت فاصل زمني

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <sys/time.h>

int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *restrict new_value,
              struct itimerval *_Nullable restrict old_value);

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

يتم توفير ثلاثة أنواع من المؤقتات—محددة عبر وسيطة which—، كل منها يحسب مقابل ساعة مختلفة ويولد إشارة مختلفة عند انتهاء المؤقت:

ITIMER_REAL
    يحسب هذا المؤقت تنازليًا في الوقت الحقيقي (أي وقت الساعة الحائطية). عند كل انتهاء، يتم توليد إشارة SIGALRM.

ITIMER_VIRTUAL
    يحسب هذا المؤقت تنازليًا مقابل وقت وحدة المعالجة المركزية في وضع المستخدم الذي تستهلكه العملية. (يشمل القياس وقت وحدة المعالجة المركزية الذي تستهلكه جميع الخيوط في العملية.) عند كل انتهاء، يتم توليد إشارة SIGVTALRM.

ITIMER_PROF
    يحسب هذا المؤقت تنازليًا مقابل إجمالي وقت وحدة المعالجة المركزية (أي كل من المستخدم والنظام) الذي تستهلكه العملية. (يشمل القياس وقت وحدة المعالجة المركزية الذي تستهلكه جميع الخيوط في العملية.) عند كل انتهاء، يتم توليد إشارة SIGPROF.

    بالاقتران مع ITIMER_VIRTUAL، يمكن استخدام هذا المؤقت لتحليل وقت وحدة المعالجة المركزية للمستخدم والنظام الذي تستهلكه العملية.

تمتلك العملية واحدًا فقط من كل نوع من الأنواع الثلاثة للمؤقتات.

يتم تعريف قيم المؤقت بواسطة الهياكل التالية:

    struct itimerval {
        struct timeval it_interval; /* Interval for periodic timer */
        struct timeval it_value;    /* Time until next expiration */
    };

    struct timeval {
        time_t      tv_sec;         /* seconds */
        suseconds_t tv_usec;        /* microseconds */
    };

  getitimer()
تضع الدالة getitimer() القيمة الحالية للمؤقت المحدد بواسطة which في المخزن المؤقت المشار إليه بواسطة curr_value.

يتم ملء البنية الفرعية it_value بمقدار الوقت المتبقي حتى الانتهاء التالي للمؤقت المحدد. تتغير هذه القيمة مع عد المؤقت تنازليًا، وسيتم إعادة ضبطها إلى it_interval عند انتهاء المؤقت. إذا كان كلا حقلي it_value صفرًا، فإن هذا المؤقت غير مسلح حاليًا (غير نشط).

يتم ملء البنية الفرعية it_interval بالفاصل الزمني للمؤقت. إذا كان كلا حقلي it_interval صفرًا، فهذا مؤقت أحادي الطلقة (أي ينتهي مرة واحدة فقط).

  setitimer()
تقوم الدالة setitimer() بتسليح أو نزع سلاح المؤقت المحدد بواسطة which، عن طريق ضبط المؤقت على القيمة المحددة بواسطة new_value. إذا كان old_value غير NULL، يتم استخدام المخزن المؤقت الذي يشير إليه لإرجاع القيمة السابقة للمؤقت (أي نفس المعلومات التي يتم إرجاعها بواسطة getitimer()).

إذا كان أي حقل في new_value.it_value غير صفري، فسيتم تسليح المؤقت لينتهي مبدئيًا في الوقت المحدد. إذا كان كلا الحقلين في new_value.it_value صفرًا، فسيتم نزع سلاح المؤقت.

يحدد حقل new_value.it_interval الفاصل الزمني الجديد للمؤقت؛ إذا كان كلا حقليه الفرعيين صفرًا، يكون المؤقت أحادي الطلقة.

قيمة الإرجاع
عند النجاح، يُعاد الصفر. وعند حدوث خطأ، يُعاد الرقم -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EFAULT
    new_value، أو old_value، أو curr_value ليس مؤشراً صالحاً.

EINVAL
    which ليس واحدًا من ITIMER_REAL أو ITIMER_VIRTUAL أو ITIMER_PROF؛ أو (منذ Linux 2.6.22) أحد حقول tv_usec في البنية المشار إليها بواسطة new_value يحتوي على قيمة خارج النطاق [0, 999999].

الإصدارات
المعايير صامتة بشأن معنى الاستدعاء:

    setitimer(which, NULL, &old_value);

تتعامل العديد من الأنظمة (Solaris و BSDs وربما غيرها) مع هذا على أنه مكافئ لـ:

    getitimer(which, &old_value);

في Linux، يتم التعامل مع هذا على أنه مكافئ لاستدعاء تكون فيه حقول new_value صفرًا؛ أي أن المؤقت معطل. لا تستخدم هذه الميزة الخاطئة في Linux: فهي غير محمولة وغير ضرورية.

المعايير
لا شيء.

التاريخ
4.2BSD، SVr4، SUSv1، POSIX.1-2001. POSIX.1-2008 وسمت getitimer() و setitimer() كمهملتين، موصية باستخدام واجهة برمجة المؤقتات POSIX (timer_gettime(2)، timer_settime(2)، إلخ) بدلاً منهما. POSIX.1-2024 أزالتهما.

ملاحظات
لن تنتهي المؤقتات أبداً قبل الوقت المطلوب، لكنها قد تنتهي بعد فترة (قصيرة) لاحقة، والتي تعتمد على دقة مؤقت النظام وعلى حمل النظام؛ انظر time(7). (لكن انظر الأخطاء أدناه.) إذا انتهى المؤقت بينما العملية نشطة (صحيح دائماً لـ ITIMER_VIRTUAL)، فسيتم تسليم الإشارة فوراً عند توليدها.

الطفل المنشأ عبر fork(2) لا يرث مؤقتات الفاصل الزمني لأبيه. المؤقتات الفاصلة محفوظة عبر execve(2).

POSIX.1 يترك التفاعل بين setitimer() والواجهات الثلاث alarm(2)، sleep(3)، و usleep(3) غير محدد.

العلل
توليد الإشارة وتسليمها متميزان، وقد تكون نسخة واحدة فقط من كل إشارة من الإشارات المذكورة أعلاه معلقة لعملية. تحت تحميل ثقيل جداً، قد ينتهي مؤقت ITIMER_REAL قبل تسليم الإشارة من انتهاء سابق. الإشارة الثانية في مثل هذا الحدث ستُفقد.

قبل لينكس 2.6.16، قيم المؤقت ممثلة في jiffies. إذا تم تقديم طلب لتعيين مؤقت بقيمة يتجاوز تمثيلها في jiffies MAX_SEC_IN_JIFFIES (المعرف في include/linux/jiffies.h)، فسيتم اقتطاع المؤقت بصمت إلى قيمة السقف هذه. على لينكس/i386 (حيث، منذ لينكس 2.6.13، jiffy المبدئي هو 0.004 ثانية)، هذا يعني أن قيمة السقف للمؤقت هي تقريباً 99.42 يوماً. منذ لينكس 2.6.16، تستخدم النواة تمثيلاً داخلياً مختلفاً للأوقات، وتمت إزالة هذا السقف.

على أنظمة معينة (بما في ذلك i386)، أنوية لينكس قبل لينكس 2.6.12 تحتوي على خطأ ينتج انتهاءات مؤقت مبكرة تصل إلى jiffy واحد تحت بعض الظروف. هذا الخطأ تم إصلاحه في لينكس 2.6.12.

POSIX.1-2001 ينص على أن setitimer() يجب أن تفشل إذا تم تحديد قيمة tv_usec خارج النطاق [0, 999999]. لكن، حتى لينكس 2.6.21 وما يشملها، لينكس لا يعطي خطأ، بل بدلاً من ذلك يضبط بصمت قيمة الثواني المقابلة للمؤقت. من لينكس 2.6.22 فصاعداً، تم إصلاح هذا عدم المطابقة: قيمة tv_usec غير صحيحة تؤدي إلى خطأ EINVAL.

انظر أيضًا
gettimeofday(2)، sigaction(2)، signal(2)، timer_create(2)، timerfd_create(2)، time(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.