nanosleep(2)

الاسم
nanosleep - سكون عالي الدقة

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

موجز
#include <time.h>

int nanosleep(const struct timespec *duration,
              struct timespec *_Nullable rem);

    متطلبات ماكروات اختبار الميزات لـ glibc (انظر feature_test_macros(7)):

nanosleep():
    _POSIX_C_SOURCE >= 199309L

الوصف
nanosleep() يعلق تنفيذ الخيط المستدعي حتى ينقضي على الأقل الوقت المحدد في *duration، أو وصول إشارة تؤدي إلى استدعاء معالج في الخيط المستدعي أو إنهاء العملية.

إذا قاطع معالج إشارة الاستدعاء، يعيد nanosleep() -1، ويضبط errno إلى EINTR، ويكتب الوقت المتبقي في البنية المشار إليها بواسطة rem ما لم يكن rem NULL. يمكن بعد ذلك استخدام قيمة *rem لاستدعاء nanosleep() مرة أخرى وإكمال الإيقاف المحدد (لكن انظر الملاحظات).

تُستخدم بنية timespec(3) لتحديد فترات زمنية بدقة نانوثانية.

يجب أن تكون قيمة حقل النانوثانية في النطاق [0, 999999999].

بالمقارنة مع sleep(3) و usleep(3)، يتمتع nanosleep() بالمزايا التالية: يوفر دقة أعلى لتحديد فترة السكون؛ يحدد POSIX.1 صراحة أنه لا يتفاعل مع الإشارات؛ ويجعل مهمة استئناف سكون قاطعه معالج إشارة أسهل.

قيمة الإرجاع
عند النوم بنجاح للمدة المطلوبة، يعيد nanosleep() 0. إذا قاطع معالج إشارة الاستدعاء أو واجه خطأ، فإنه يعيد -1، مع ضبط errno للإشارة إلى الخطأ.

الأخطاء

EFAULT
    مشكلة في نسخ المعلومات من مساحة المستخدم.

EINTR
    قاطع الإيقاف إشارة تم تسليمها إلى الخيط (انظر signal(7)). تم كتابة وقت السكون المتبقي في *rem ليتمكن الخيط من استدعاء nanosleep() مرة أخرى بسهولة ومتابعة الإيقاف.

EINVAL
    القيمة في حقل tv_nsec لم تكن في النطاق [0, 999999999] أو tv_sec كانت سالبة.

الإصدارات
يحدد POSIX.1 أن nanosleep() يجب أن يقيس الوقت مقابل ساعة CLOCK_REALTIME. ومع ذلك، يقيس Linux الوقت باستخدام ساعة CLOCK_MONOTONIC. ربما لا يهم هذا، لأن مواصفات POSIX.1 لـ clock_settime(2) تقول إن التغييرات غير المستمرة في CLOCK_REALTIME لا ينبغي أن تؤثر على nanosleep():

    ضبط قيمة ساعة CLOCK_REALTIME عبر clock_settime(2) لن يكون له أي تأثير على الخيوط المحظورة في انتظار خدمة وقت نسبي بناءً على هذه الساعة، بما في ذلك دالة nanosleep(). وبالتالي، ستنتهي صلاحية خدمات الوقت هذه عند انقضاء المدة المطلوبة، بغض النظر عن القيمة الجديدة أو القديمة للساعة.

المعايير
POSIX.1-2024.

التاريخ
POSIX.1-2001.

لدعم التطبيقات التي تتطلب إيقافات أكثر دقة (مثلًا، للتحكم في بعض الأجهزة الحساسة للوقت)، كان nanosleep() يعالج إيقافات تصل إلى 2 ملي ثانية بالانتظار المزدحم بدقة ميكروثانية عند استدعائه من خيط مجدول تحت سياسة زمن حقيقي مثل SCHED_FIFO أو SCHED_RR. تمت إزالة هذا الامتداد الخاص في Linux 2.5.39، وبالتالي فهو غير متاح في Linux 2.6.0 والإصدارات الأحدث من النواة.

ملاحظات
إذا لم تكن duration مضاعفًا دقيقًا لدقة الساعة الأساسية (انظر time(7))، فسيتم تقريب الفاصل الزمني إلى المضاعف التالي. علاوة على ذلك، بعد اكتمال السكون، قد يظل هناك تأخير قبل أن تصبح وحدة المعالجة المركزية حرة لتنفيذ الخيط المستدعي مرة أخرى.

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

العلل
إذا تلقى برنامج يلتقط الإشارات ويستخدم nanosleep() إشارات بمعدل مرتفع جدًا، فإن تأخيرات الجدولة وأخطاء التقريب في حساب النواة لفاصل السكون وقيمة remain المرتجعة تعني أن قيمة remain قد تزداد بشكل ثابت في عمليات إعادة التشغيل المتتالية لاستدعاء nanosleep(). لتجنب مثل هذه المشكلات، استخدم clock_nanosleep(2) مع علامة TIMER_ABSTIME للنوم حتى موعد نهائي مطلق.

في Linux 2.4، إذا أوقفت إشارة (مثل SIGTSTP) nanosleep()، يفشل الاستدعاء بالخطأ EINTR بعد استئناف الخيط بإشارة SIGCONT. إذا تمت إعادة تشغيل استدعاء النظام لاحقًا، فإن الوقت الذي قضاه الخيط في الحالة الموقوفة لا يُحتسب ضمن فاصل السكون. تم إصلاح هذه المشكلة في Linux 2.6.0 والإصدارات الأحدث من النواة.

انظر أيضًا
clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7)

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

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

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