sigwaitinfo(2)

الاسم
sigwaitinfo, sigtimedwait, rt_sigtimedwait - انتظار متزامن للإشارات المصفوفة

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

موجز
#include <signal.h>

int sigwaitinfo(const sigset_t *restrict set,
                siginfo_t *_Nullable restrict info);
int sigtimedwait(const sigset_t *restrict set,
                siginfo_t *_Nullable restrict info,
                const struct timespec *restrict timeout);

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

sigwaitinfo(), sigtimedwait():
    _POSIX_C_SOURCE >= 199309L

الوصف
sigwaitinfo() تعلق تنفيذ الخيط المستدعي حتى تصبح إشارة واحدة من set معلقة (إذا كانت إحدى الإشارات في set معلقة بالفعل للخيط المستدعي، فستعود sigwaitinfo() فورًا.)

sigwaitinfo() تزيل الإشارة من مجموعة الإشارات المعلقة وتعيد رقم الإشارة كنتيجة للدالة. إذا كانت الوسيطة info ليست NULL، فسيتم استخدام المخزن المؤقت الذي تشير إليه لإرجاع بنية من النوع siginfo_t (انظر sigaction(2)) تحتوي على معلومات حول الإشارة.

إذا كانت إشارات متعددة في set معلقة للمستدعي، يتم تحديد الإشارة التي يسترجعها sigwaitinfo() وفقًا لقواعد الترتيب المعتادة؛ انظر signal(7) لمزيد من التفاصيل.

تعمل sigtimedwait() بنفس طريقة sigwaitinfo() تمامًا باستثناء أن لها وسيطة إضافية، timeout، والتي تحدد الفاصل الزمني الذي يتم فيه تعليق الخيط في انتظار إشارة. (سيتم تقريب هذا الفاصل الزمني إلى دقة ساعة النظام، وتأخيرات جدولة النواة تعني أن الفاصل الزمني قد يتجاوز بمقدار صغير.) هذه الوسيطة هي بنية timespec(3).

إذا تم تحديد كلا الحقلين من هذه البنية على أنهما 0، يتم إجراء استقصاء: تعود sigtimedwait() فورًا، إما بمعلومات حول إشارة كانت معلقة للمستدعي، أو بخطأ إذا لم تكن أي من الإشارات في set معلقة.

قيمة الإرجاع
عند النجاح، تعيد كل من sigwaitinfo() و sigtimedwait() رقم إشارة (أي قيمة أكبر من الصفر). عند الفشل، تعيد كلتا الاستدعاءتين -1، مع تعيين errno للإشارة إلى الخطأ.

الأخطاء

EAGAIN
    لم تصبح أي إشارة في set معلقة خلال فترة timeout المحددة لـ sigtimedwait().

EINTR
    تمت مقاطعة الانتظار بواسطة معالج إشارة؛ انظر signal(7). (كان هذا المعالج لإشارة غير تلك الموجودة في set.)

EINVAL
    كانت timeout غير صالحة.

الإصدارات

  الاختلافات بين مكتبة C والنواة
في لينكس، sigwaitinfo() هي دالة مكتبة مطبقة فوق sigtimedwait().

دوال التغليف glibc لـ sigwaitinfo() و sigtimedwait() تتجاهل بصمت محاولات انتظار إشارتي الوقت الحقيقي المستخدمتين داخليًا بواسطة تطبيق خيوط NPTL. انظر nptl(7) للتفاصيل.

كان اسم استدعاء النظام الأصلي في لينكس هو sigtimedwait(). ومع ذلك، مع إضافة إشارات الوقت الحقيقي في لينكس 2.2، لم يعد النوع ذو الحجم الثابت 32 بت sigset_t المدعوم من قبل ذلك الاستدعاء مناسبًا للغرض. وبالتالي، تمت إضافة استدعاء نظام جديد، rt_sigtimedwait()، لدعم نوع sigset_t موسع. يأخذ استدعاء النظام الجديد وسيطة رابعة، size_t sigsetsize، والتي تحدد الحجم بالبايت لمجموعة الإشارات في set. هذه الوسيطة مطلوبة حاليًا أن تكون قيمتها sizeof(sigset_t) (وإلا ينتج الخطأ EINVAL). دالة التغليف glibc sigtimedwait() تخفي هذه التفاصيل عنا، وتستدعي بشفافية rt_sigtimedwait() عندما توفرها النواة.

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

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

ملاحظات
في الاستخدام العادي، يقوم البرنامج المستدعي بحظر الإشارات في set عبر استدعاء سابق لـ sigprocmask(2) (بحيث لا يحدث التصرف المبدئي لهذه الإشارات إذا أصبحت معلقة بين الاستدعاءات المتتالية لـ sigwaitinfo() أو sigtimedwait()) ولا ينشئ معالجات لهذه الإشارات. في برنامج متعدد الخيوط، يجب حظر الإشارة في جميع الخيوط، لمنع معالجة الإشارة وفقًا لتصرفها المبدئي في خيط غير الخيط الذي يستدعي sigwaitinfo() أو sigtimedwait()).

مجموعة الإشارات المعلقة لخيط معين هي اتحاد مجموعة الإشارات المعلقة تحديدًا لذلك الخيط ومجموعة الإشارات المعلقة للعملية ككل (انظر signal(7)).

محاولات انتظار SIGKILL و SIGSTOP يتم تجاهلها بصمت.

إذا كانت خيوط متعددة من عملية محظورة في انتظار نفس الإشارة (الإشارات) في sigwaitinfo() أو sigtimedwait()، فسيستقبل بالضبط واحد من الخيوط الإشارة فعليًا إذا أصبحت معلقة للعملية ككل؛ أي من الخيوط يستقبل الإشارة غير محدد.

لا يمكن استخدام sigwaitinfo() أو sigtimedwait() لاستقبال الإشارات المولدة بشكل متزامن، مثل إشارة SIGSEGV الناتجة عن الوصول إلى عنوان ذاكرة غير صالح أو إشارة SIGFPE الناتجة عن خطأ حسابي. يمكن التقاط هذه الإشارات فقط عبر معالج إشارة.

يترك POSIX معنى القيمة NULL للوسيطة timeout لـ sigtimedwait() غير محدد، مما يسمح بإمكانية أن يكون لها نفس معنى استدعاء sigwaitinfo()، وبالفعل هذا ما يتم فعله في لينكس.

انظر أيضًا
kill(2), sigaction(2), signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigqueue(3), sigsetops(3), sigwait(3), timespec(3), signal(7), time(7)

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

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

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