Scroll to navigation

epoll_ctl(2) System Calls Manual epoll_ctl(2)

الاسم

epoll_ctl - واجهة تحكم لوصف ملف epoll

المكتبة

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

موجز

#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd,
              struct epoll_event *_Nullable event);

الوصف

تُستخدم استدعاء النظام هذا لإضافة أو تعديل أو إزالة إدخالات في قائمة الاهتمامات لمثيل epoll(7) المشار إليه بواصف الملف epfd. يطلب تنفيذ العملية op لواصف الملف الهدف fd.

القيم الصالحة للوسيطة op هي:

إضافة إدخال إلى قائمة الاهتمامات لواصف ملف epoll، epfd. يتضمن الإدخال واصف الملف fd، مرجعًا لوصف الملف المفتوح المقابل (انظر epoll(7) وopen(2))، والإعدادات المحددة في event.
تغيير الإعدادات المرتبطة بـ fd في قائمة الاهتمامات إلى الإعدادات الجديدة المحددة في event.
إزالة (إلغاء تسجيل) واصف الملف الهدف fd من قائمة الاهتمامات. يتم تجاهل الوسيطة event ويمكن أن تكون NULL (ولكن انظر الأخطاء أدناه).

تصف الوسيطة event الكائن المرتبط بواصف الملف fd. يتم وصف struct epoll_event في epoll_event(3type).

يحدد العضو data من بنية epoll_event البيانات التي يجب على النواة حفظها ثم إرجاعها (عبر epoll_wait(2)) عندما يصبح واصف الملف هذا جاهزًا.

العضو events من بنية epoll_event هو قناع بتات مكون من دمج صفر أو أكثر من أنواع الأحداث (التي تُرجعها epoll_wait(2)) وأعلام الإدخال التي تؤثر على سلوكها ولكنها لا تُرجع. أنواع الأحداث المتاحة هي:

الملف المرتبط متاح لعمليات read(2).
الملف المرتبط متاح لعمليات write(2).
أغلق النظير لمقبس الدفق الاتصال، أو أوقف كتابة نصف الاتصال. (هذا العلم مفيد بشكل خاص لكتابة كود بسيط لاكتشاف إغلاق النظير عند استخدام المراقبة المحفزة بالحافة.)
يوجد حالة استثنائية على واصف الملف. انظر مناقشة POLLPRI في poll(2).
حدثت حالة خطأ على واصف الملف المرتبط. يتم الإبلاغ عن هذا الحدث أيضًا لنهاية الكتابة للأنبوب عندما تكون نهاية القراءة قد أغلقت.
ستقوم epoll_wait(2) دائمًا بالإبلاغ عن هذا الحدث؛ ليس من الضروري تعيينه في events عند استدعاء epoll_ctl().
حدث إغلاق (Hang up) على واصف الملف المرتبط.
ستنتظر epoll_wait(2) دائمًا هذا الحدث؛ ليس من الضروري تعيينه في events عند استدعاء epoll_ctl().
لاحظ أنه عند القراءة من قناة مثل أنبوب أو مقبس دفق، يشير هذا الحدث فقط إلى أن النظير أغلق نهايته من القناة. ستُرجع القراءات اللاحقة من القناة 0 (نهاية الملف) فقط بعد استهلاك جميع البيانات المعلقة في القناة.

وأعلام الإدخال المتاحة هي:

يطلب إعلامًا محفزًا بالحافة لواصف الملف المرتبط. السلوك المبدئي لـ epoll هو محفز بالمستوى. انظر epoll(7) لمزيد من المعلومات التفصيلية حول الإعلام المحفز بالحافة والمحفز بالمستوى.
يطلب إعلامًا لمرة واحدة لواصف الملف المرتبط. هذا يعني أنه بعد إعلام حدث لواصف الملف بواسطة epoll_wait(2)، يتم تعطيل واصف الملف في قائمة الاهتمامات ولن يتم الإبلاغ عن أي أحداث أخرى بواسطة واجهة epoll. يجب على المستخدم استدعاء epoll_ctl() مع EPOLL_CTL_MOD لإعادة تسليح واصف الملف بقناع حدث جديد.
إذا كانت EPOLLONESHOT وEPOLLET غير مضبوطتين وكانت العملية تمتلك القدرة CAP_BLOCK_SUSPEND، فتأكد من أن النظام لا يدخل في وضع "تعليق" أو "إسبات" أثناء تعليق هذا الحدث أو معالجته. يُعتبر الحدث قيد "المعالجة" من الوقت الذي يتم إرجاعه فيه بواسطة استدعاء epoll_wait(2) حتى الاستدعاء التالي لـ epoll_wait(2) على نفس واصف ملف epoll(7)، أو إغلاق واصف الملف ذلك، أو إزالة واصف ملف الحدث باستخدام EPOLL_CTL_DEL، أو مسح EPOLLWAKEUP لواصف ملف الحدث باستخدام EPOLL_CTL_MOD. انظر أيضًا الأخطاء.
يضبط وضع إيقاظ حصري لواصف ملف epoll الذي يتم إرفاقه بواصف الملف الهدف fd. عند حدوث حدث إيقاظ وإرفاق واصفات ملفات epoll متعددة بنفس الملف الهدف باستخدام EPOLLEXCLUSIVE، سيستقبل واحد أو أكثر من واصفات ملفات epoll حدثًا باستخدام epoll_wait(2). المبدئي في هذا السيناريو (عند عدم تعيين EPOLLEXCLUSIVE) هو أن تستقبل جميع واصفات ملفات epoll حدثًا. وبالتالي فإن EPOLLEXCLUSIVE مفيد لتجنب مشاكل الازدحام الجماعي في سيناريوهات معينة.
إذا كان نفس واصف الملف موجودًا في مثيلات epoll متعددة، بعضها مع العلم EPOLLEXCLUSIVE والبعض الآخر بدونه، فسيتم توفير الأحداث لجميع مثيلات epoll التي لم تحدد EPOLLEXCLUSIVE، وواحد على الأقل من مثيلات epoll التي حددت EPOLLEXCLUSIVE.
يمكن تحديد القيم التالية بالتزامن مع EPOLLEXCLUSIVE: EPOLLIN وEPOLLOUT وEPOLLWAKEUP وEPOLLET. يمكن أيضًا تحديد EPOLLHUP وEPOLLERR، ولكن هذا غير مطلوب: كالمعتاد، يتم الإبلاغ عن هذه الأحداث دائمًا في حالة حدوثها، بغض النظر عما إذا كانت محددة في events. تؤدي محاولات تحديد قيم أخرى في events إلى الخطأ EINVAL.
يمكن استخدام EPOLLEXCLUSIVE فقط في عملية EPOLL_CTL_ADD؛ تؤدي محاولات استخدامه مع EPOLL_CTL_MOD إلى خطأ. إذا تم تعيين EPOLLEXCLUSIVE باستخدام epoll_ctl()، فإن EPOLL_CTL_MOD لاحقًا على نفس الزوج epfdfd يؤدي إلى خطأ. سيفشل أيضًا استدعاء epoll_ctl() الذي يحدد EPOLLEXCLUSIVE في events ويحدد واصف الملف الهدف fd كمثيل epoll. الخطأ في كل هذه الحالات هو EINVAL.

قيمة الإرجاع

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

الأخطاء

epfd أو fd ليسا واصف ملف صالحًا.
كانت op هي EPOLL_CTL_ADD، وواصف الملف المُقدم fd مُسجل بالفعل مع مثيل epoll هذا.
epfd ليس واصف ملف epoll، أو fd مطابق لـ epfd، أو العملية المطلوبة op غير مدعومة من هذه الواجهة.
حُدد نوع حدث غير صالح مع EPOLLEXCLUSIVE في events.
كانت op هي EPOLL_CTL_MOD وتضمنت events EPOLLEXCLUSIVE.
كانت op هي EPOLL_CTL_MOD وقد طُبقت العلامة EPOLLEXCLUSIVE سابقًا على هذا الزوج epfdfd.
حُدد EPOLLEXCLUSIVE في event ويشير fd إلى مثيل epoll.
يشير fd إلى مثيل epoll وستؤدي عملية EPOLL_CTL_ADD هذه إلى حلقة دائرية من مثيلات epoll تراقب بعضها البعض أو عمق تداخل لمثيلات epoll أكبر من 5.
كانت op هي EPOLL_CTL_MOD أو EPOLL_CTL_DEL، وfd غير مُسجل مع مثيل epoll هذا.
كانت الذاكرة غير كافية لمعالجة عملية التحكم op المطلوبة.
وُجد الحد المفروض بواسطة /proc/sys/fs/epoll/max_user_watches أثناء محاولة تسجيل (EPOLL_CTL_ADD) واصف ملف جديد على مثيل epoll. انظر epoll(7) لمزيد من التفاصيل.
الملف الهدف fd لا يدعم epoll. يمكن أن يحدث هذا الخطأ إذا كان fd يشير، على سبيل المثال، إلى ملف عادي أو دليل.

المعايير

لينكس.

التاريخ

لينكس 2.6، glibc 2.3.2.

ملاحظات

واجهة epoll تدعم جميع واصفات الملفات التي تدعم poll(2).

العلل

قبل لينكس 2.6.9، تطلبت عملية EPOLL_CTL_DEL مؤشرًا غير فارغ في event، على الرغم من تجاهل هذه الوسيطة. منذ لينكس 2.6.9، يمكن تحديد event كـ NULL عند استخدام EPOLL_CTL_DEL. التطبيقات التي تحتاج إلى أن تكون محمولة على أنوية قبل لينكس 2.6.9 يجب أن تحدد مؤشرًا غير فارغ في event.

إذا حُدد EPOLLWAKEUP في flags، لكن المستدعي لا يمتلك القدرة CAP_BLOCK_SUSPEND، فإن العلامة EPOLLWAKEUP تُتجاهل بصمت. هذا السلوك المؤسف ضروري لأنه لم تُجرَ فحوصات صلاحية على وسيطة flags في التنفيذ الأصلي، وإضافة EPOLLWAKEUP مع فحص يتسبب في فشل الاستدعاء إذا لم يمتلك المستدعي القدرة CAP_BLOCK_SUSPEND تسبب في كسر تطبيق واحد على الأقل في مساحة المستخدم الذي صادف أنه حدد هذه البتة عشوائيًا (وبدون فائدة). لذلك يجب على التطبيق القوي التحقق مرة أخرى من امتلاكه القدرة CAP_BLOCK_SUSPEND إذا كان يحاول استخدام العلامة EPOLLWAKEUP.

انظر أيضًا

epoll_create(2)، epoll_wait(2)، ioctl_eventpoll(2)، poll(2)، epoll(7)

ترجمة

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

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

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

25 ديسمبر 2025 صفحات دليل لينكس (لم تصدر بعد)