epoll_wait(2)

الاسم
epoll_wait, epoll_pwait, epoll_pwait2 - انتظار حدث إدخال/إخراج على واصف ملف epoll

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

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

int epoll_wait(int n;
               int epfd, struct epoll_event events[n], int n,
               int timeout);
int epoll_pwait(int n;
               int epfd, struct epoll_event events[n], int n,
               int timeout,
               const sigset_t *_Nullable sigmask);
int epoll_pwait2(int n;
               int epfd, struct epoll_event events[n], int n,
               const struct timespec *_Nullable timeout,
               const sigset_t *_Nullable sigmask);

الوصف
استدعاء النظام epoll_wait() ينتظر الأحداث على مثيل epoll(7) المشار إليه بواصف الملف epfd. يُستخدم المخزن المؤقت المشار إليه بواسطة events لإرجاع معلومات من قائمة الجاهزية حول واصفات الملف في قائمة الاهتمام التي تتوفر لها بعض الأحداث. يُرجع epoll_wait() حتى n حدثًا. يجب أن تكون وسيطة n أكبر من الصفر.

تحدد وسيطة timeout عدد الميلي ثانية التي سيحجب فيها epoll_wait(). يُقاس الوقت مقابل ساعة CLOCK_MONOTONIC.

سيحجب استدعاء epoll_wait() حتى أحد الشرطين:

•   يسلم واصف ملف حدثًا؛

•   الاستدعاء قوطع بواسطة معالج إشارة؛ أو

•   تنتهي مهلة timeout.

لاحظ أن فترة timeout ستُقرّب لأعلى إلى دقة ساعة النظام، وتأخيرات جدولة النواة تعني أن فترة الحجب قد تتجاوز بمقدار صغير. تحديد timeout بقيمة -1 يجعل epoll_wait() يحجب إلى أجل غير مسمى، بينما تحديد timeout بقيمة صفر يجعل epoll_wait() يعود فورًا، حتى لو لم تتوفر أحداث.

يُوصف struct epoll_event في epoll_event(3type).

يحتوي حقل data لكل بنية epoll_event مُعادة على نفس البيانات التي تم تحديدها في أحدث استدعاء لـ epoll_ctl(2) (EPOLL_CTL_ADD، EPOLL_CTL_MOD) لواصف الملف المفتوح المقابل.

حقل events هو قناع بتات يشير إلى الأحداث التي حدثت لوصف الملف المفتوح المقابل. انظر epoll_ctl(2) للحصول على قائمة بالبتات التي قد تظهر في هذا القناع.

  epoll_pwait()
العلاقة بين epoll_wait() و epoll_pwait() مماثلة للعلاقة بين select(2) و pselect(2): مثل pselect(2)، يسمح epoll_pwait() للتطبيق بالانتظار بأمان حتى يصبح واصف الملف جاهزًا أو حتى يتم التقاط إشارة.

استدعاء epoll_pwait() التالي:

    ready = epoll_pwait(epfd, &events, n, timeout, &sigmask);

يعادل تنفيذ الاستدعاءات التالية بشكل ذري:

    sigset_t origmask;

    pthread_sigmask(SIG_SETMASK, &sigmask, &origmask);
    ready = epoll_wait(epfd, &events, n, timeout);
    pthread_sigmask(SIG_SETMASK, &origmask, NULL);

يمكن تحديد وسيطة sigmask كـ NULL، وفي هذه الحالة يكون epoll_pwait() مكافئًا لـ epoll_wait().

  epoll_pwait2()
استدعاء النظام epoll_pwait2() مكافئ لـ epoll_pwait() باستثناء وسيطة timeout. يأخذ وسيطة من النوع timespec لتتمكن من تحديد مهلة بدقة نانو ثانية. تعمل هذه الوسيطة بنفس الطريقة كما في pselect(2) و ppoll(2). إذا كان timeout هو NULL، فيمكن لـ epoll_pwait2() الحجب إلى أجل غير مسمى.

قيمة الإرجاع
عند النجاح، يُرجع epoll_wait() عدد واصفات الملف الجاهزة لعملية الإدخال/الإخراج المطلوبة، أو صفرًا إذا لم يصبح أي واصف ملف جاهزًا خلال timeout ميلي ثانية المطلوبة. عند الفشل، يُرجع epoll_wait() -1 ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EBADF
    epfd ليس واصف ملف صالحًا.

EFAULT
    منطقة الذاكرة المشار إليها بواسطة events غير قابلة للوصول بأذونات الكتابة.

EINTR
    تم مقاطعة الاستدعاء بواسطة معالج إشارة قبل (1) حدوث أي من الأحداث المطلوبة أو (2) انتهاء timeout؛ انظر signal(7).

EINVAL
    epfd ليس واصف ملف epoll، أو n أقل من أو يساوي الصفر.

المعايير
لينكس.

التاريخ

epoll_wait()
    لينكس 2.6، glibc 2.3.2.

epoll_pwait()
    لينكس 2.6.19، glibc 2.6.

epoll_pwait2()
    لينكس 5.11.

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

إذا كان أكثر من n واصف ملف جاهزًا عند استدعاء epoll_wait()، فإن استدعاءات epoll_wait() المتتالية ستتنقل دوريًا عبر مجموعة واصفات الملف الجاهزة. يساعد هذا السلوك في تجنب سيناريوهات التجويع، حيث تفشل عملية في ملاحظة أن واصفات ملف إضافية جاهزة لأنها تركز على مجموعة من واصفات الملف المعروفة بالفعل بأنها جاهزة.

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

  الاختلافات بين مكتبة C والنواة
استدعاءات النظام الخام epoll_pwait() و epoll_pwait2() لها وسيطة سادسة، size_t sigsetsize، والتي تحدد الحجم بالبايت لوسيطة sigmask. تحدد دالة الغلاف glibc epoll_pwait() هذه الوسيطة كقيمة ثابتة (تساوي sizeof(sigset_t)).

العلل
قبل لينكس 2.6.37، تُعالج قيمة timeout أكبر من حوالي LONG_MAX / HZ ميلي ثانية كـ -1 (أي، لانهاية). وبالتالي، على سبيل المثال، على نظام حيث sizeof(long) هو 4 وقيمة HZ للنواة هي 1000، فهذا يعني أن المهلات الأكبر من 35.79 دقيقة تُعالج كلانهاية.

انظر أيضًا
epoll_create(2)، epoll_ctl(2)، epoll(7)

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

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

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