.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2008, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH eventfd 2 "16 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم eventfd \- إنشاء واصف ملف للإعلام بالأحداث .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint eventfd(unsigned int \fP\fIinitval\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH الوصف تنشئ \fBeventfd\fP() "كائن eventfd" يمكن استخدامه كآلية انتظار/إعلام بالأحداث من قبل تطبيقات مساحة المستخدم، ومن قبل النواة لإعلام تطبيقات مساحة المستخدم بالأحداث. يحتوي الكائن على عداد صحيح غير موقع 64 بت (\fIuint64_t\fP) تحتفظ به النواة. يُهيأ هذا العداد بالقيمة المحددة في الوسيط \fIinitval\fP. .P كقيمة إرجاع، تُرجع \fBeventfd\fP() واصف ملف جديد يمكن استخدامه للإشارة إلى كائن eventfd. .P يمكن تطبيق عملية OR على مستوى البتات للقيم التالية في \fIflags\fP لتغيير سلوك \fBeventfd\fP(): .TP \fBEFD_CLOEXEC\fP (منذ لينكس 2.6.27) اضبط علامة الإغلاق عند التنفيذ (\fBFD_CLOEXEC\fP) على واصف الملف الجديد. انظر وصف العلامة \fBO_CLOEXEC\fP في \fBopen\fP(2) للأسباب التي تجعل هذا مفيدًا. .TP \fBEFD_NONBLOCK\fP (منذ لينكس 2.6.27) اضبط علامة حالة الملف \fBO_NONBLOCK\fP على وصف الملف المفتوح (انظر \fBopen\fP(2)) المشار إليه بواسطة واصف الملف الجديد. استخدام هذه العلامة يوفر استدعاءات إضافية لـ \fBfcntl\fP(2) لتحقيق النتيجة نفسها. .TP \fBEFD_SEMAPHORE\fP (منذ لينكس 2.6.30) توفر دلالات شبيهة بالإشارة (semaphore) للقراءات من واصف الملف الجديد. انظر أدناه. .P حتى لينكس 2.6.26، معطى \fIflags\fP غير مستخدم، ويجب تحديده كصفر. .P يمكن تنفيذ العمليات التالية على واصف الملف المُعاد بواسطة \fBeventfd\fP(): .TP \fBread\fP(2) تُرجع كل \fBread\fP(2) ناجحة عددًا صحيحًا من 8 بايت. تفشل \fBread\fP(2) مع الخطأ \fBEINVAL\fP إذا كان حجم المخزن المؤقت المقدم أقل من 8 بايت. .IP القيمة المُعادة بواسطة \fBread\fP(2) تكون بترتيب بايت المضيف\[em]أي ترتيب البايت الأصلي للأعداد الصحيحة على جهاز المضيف. .IP تعتمد دلالات \fBread\fP(2) على ما إذا كان عداد eventfd لديه حاليًا قيمة غير صفرية وما إذا كانت العلامة \fBEFD_SEMAPHORE\fP قد حُددت عند إنشاء واصف ملف eventfd: .RS .IP \[bu] 3 إذا لم تُحدد \fBEFD_SEMAPHORE\fP وكان للعداد eventfd قيمة غير صفرية، فإن \fBread\fP(2) تُرجع 8 بايت تحتوي على تلك القيمة، وتُعاد قيمة العداد إلى الصفر. .IP \[bu] إذا حُددت \fBEFD_SEMAPHORE\fP وكان للعداد eventfd قيمة غير صفرية، فإن \fBread\fP(2) تُرجع 8 بايت تحتوي على القيمة 1، وتُقلل قيمة العداد بمقدار 1. .IP \[bu] إذا كان عداد eventfd صفرًا وقت استدعاء \fBread\fP(2)، فإن الاستدعاء إما أن يحظر حتى يصبح العداد غير صفري (وعندها، تستمر \fBread\fP(2) كما هو موصوف أعلاه) أو يفشل مع الخطأ \fBEAGAIN\fP إذا جُعل واصف الملف غير محظور. .RE .TP \fBwrite\fP(2) يضيف استدعاء \fBwrite\fP(2) قيمة العدد الصحيح 8 بايت المقدمة في مخزنه المؤقت إلى العداد. القيمة القصوى التي يمكن تخزينها في العداد هي أكبر قيمة غير موقعة 64 بت ناقص 1 (أي 0xfffffffffffffffe). إذا تسببت الإضافة في تجاوز قيمة العداد للحد الأقصى، فإن \fBwrite\fP(2) إما تحظر حتى تُنفذ \fBread\fP(2) على واصف الملف، أو تفشل مع الخطأ \fBEAGAIN\fP إذا جُعل واصف الملف غير محظور. .IP تفشل \fBwrite\fP(2) مع الخطأ \fBEINVAL\fP إذا كان حجم المخزن المؤقت المقدم أقل من 8 بايت، أو إذا جرت محاولة لكتابة القيمة 0xffffffffffffffff. .TP \fBpoll\fP(2) .TQ \fBselect\fP(2) .TQ (وما شابه ذلك) يدعم واصف الملف المُعاد \fBpoll\fP(2) (وبالمثل \fBepoll\fP(7)) و \fBselect\fP(2)، كما يلي: .RS .IP \[bu] 3 واصف الملف قابل للقراءة (وسيط \fBselect\fP(2) \fIreadfds\fP؛ علامة \fBpoll\fP(2) \fBPOLLIN\fP) إذا كان للعداد قيمة أكبر من 0. .IP \[bu] واصف الملف قابل للكتابة (وسيط \fBselect\fP(2) \fIwritefds\fP؛ علامة \fBpoll\fP(2) \fBPOLLOUT\fP) إذا كان من الممكن كتابة قيمة لا تقل عن "1" دون حظر. .IP \[bu] إذا اكتُشف تجاوز لقيمة العداد، فإن \fBselect\fP(2) تشير إلى واصف الملف على أنه قابل للقراءة والكتابة معًا، وتُرجع \fBpoll\fP(2) حدث \fBPOLLERR\fP. كما ذُكر أعلاه، لا يمكن لـ \fBwrite\fP(2) أبدًا تجاوز العداد. ومع ذلك، يمكن أن يحدث تجاوز إذا نُفذت 2\[ha]64 "إشارة إرسال" eventfd بواسطة النظام الفرعي KAIO (ممكن نظريًا، لكنه غير محتمل عمليًا). إذا حدث تجاوز، فإن \fBread\fP(2) ستُرجع قيمة \fIuint64_t\fP القصوى (أي 0xffffffffffffffff). .RE .IP يدعم واصف ملف eventfd أيضًا واجهات برمجة تطبيقات تعدد إرسال واصفات الملف الأخرى: \fBpselect\fP(2) و \fBppoll\fP(2). .TP \fBclose\fP(2) عندما لا يعود واصف الملف مطلوبًا، يجب إغلاقه. عندما تُغلق جميع واصفات الملف المرتبطة بنفس كائن eventfd، تُحرر النواة موارد الكائن. .P تُورث نسخة من واصف الملف الذي أنشأته \fBeventfd\fP() بواسطة العملية التابعة الناتجة عن \fBfork\fP(2). يرتبط واصف الملف المكرر بنفس كائن eventfd. تُحفظ واصفات الملف التي أنشأتها \fBeventfd\fP() عبر \fBexecve\fP(2)، ما لم تُضبط علامة الإغلاق عند التنفيذ. .SH "قيمة الإرجاع" عند النجاح، تُرجع \fBeventfd\fP() واصف ملف eventfd جديد. عند الخطأ، تُرجع \-1 ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEINVAL\fP عُيّنت قيمة غير مدعومة في \fIflags\fP. .TP \fBEMFILE\fP وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية. .TP \fBENFILE\fP وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام. .TP \fBENODEV\fP .\" Note from Davide: .\" The ENODEV error is basically never going to happen if .\" the kernel boots correctly. That error happen only if during .\" the kernel initialization, some error occur in the anonymous .\" inode source initialization. تعذر وصل جهاز inode (داخلي) مجهول. .TP \fBENOMEM\fP لم تكن هناك ذاكرة كافية لإنشاء واصف ملف eventfd جديد. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBeventfd\fP() T} سلامة الخيوط MT\-Safe .TE .SH الإصدارات .SS "الاختلافات بين مكتبة C والنواة" يوجد استدعاءان نظاميان أساسيان في لينكس: \fBeventfd\fP() و \fBeventfd2\fP() الأحدث. لا ينفذ استدعاء النظام الأول وسيط \fIflags\fP. ينفذ استدعاء النظام الثاني قيم \fIflags\fP الموصوفة أعلاه. ستستخدم دالة الغلاف glibc \fBeventfd2\fP() حيثما كانت متاحة. .SS "ميزات glibc إضافية" تعرف مكتبة C في GNU نوعًا إضافيًا، ودالتين تحاولان تجريد بعض تفاصيل القراءة والكتابة على واصف ملف eventfd: .P .in +4n .EX typedef uint64_t eventfd_t; \& int eventfd_read(int fd, eventfd_t *value); int eventfd_write(int fd, eventfd_t value); .EE .in .P تنفذ الدالتان عمليات القراءة والكتابة على واصف ملف eventfd، وتُعيدان 0 إذا نُقل العدد الصحيح من البايتات، أو \-1 بخلاف ذلك. .SH المعايير لينكس، جنو. .SH التاريخ .TP \fBeventfd\fP() .\" eventfd() is in glibc 2.7, but reportedly does not build لينكس 2.6.22، glibc 2.8. .TP \fBeventfd2\fP() لينكس 2.6.27 (انظر الإصدارات). منذ glibc 2.9، ستستخدم الدالة المغلفة \fBeventfd\fP() استدعاء النظام \fBeventfd2\fP() إذا كان مدعومًا من النواة. .SH ملاحظات يمكن للتطبيقات استخدام واصف ملف eventfd بدلاً من الأنبوب (انظر \fBpipe\fP(2)) في جميع الحالات التي يُستخدم فيها الأنبوب ببساطة للإشارة إلى الأحداث. الحمل الزائد للنواة لواصف ملف eventfd أقل بكثير من ذلك الخاص بالأنبوب، ويلزم واصف ملف واحد فقط (مقابل اثنين مطلوبين للأنبوب). .P .\" or eventually syslets/threadlets عند استخدامه في النواة، يمكن لواصف ملف eventfd توفير جسر من النواة إلى مساحة المستخدم، مما يسمح، على سبيل المثال، لوظائف مثل KAIO (AIO النواة) بالإشارة إلى واصف ملف بأن عملية ما قد اكتملت. .P نقطة رئيسية حول واصف ملف eventfd هي أنه يمكن مراقبته تمامًا مثل أي واصف ملف آخر باستخدام \fBselect\fP(2) أو \fBpoll\fP(2) أو \fBepoll\fP(7). هذا يعني أن التطبيق يمكنه مراقبة جاهزية الملفات "التقليدية" وجاهزية آليات النواة الأخرى التي تدعم واجهة eventfd في وقت واحد. (بدون واجهة \fBeventfd\fP()، لا يمكن تعدد هذه الآليات عبر \fBselect\fP(2) أو \fBpoll\fP(2) أو \fBepoll\fP(7).) .P يمكن عرض القيمة الحالية لعداد eventfd عبر الإدخال الخاص بواصف الملف المقابل في دليل \fI/proc/\fPpid\fI/fdinfo\fP الخاص بالعملية. انظر \fBproc\fP(5) لمزيد من التفاصيل. .SH أمثلة يقوم البرنامج التالي بإنشاء واصف ملف eventfd ثم يتفرع لإنشاء عملية تابعة. بينما ينام الأب لفترة وجيزة، يكتب الابن كل عدد صحيح من الأعداد الصحيحة المقدمة في وسائط سطر أوامر البرنامج إلى واصف ملف eventfd. عندما ينهي الأب النوم، يقرأ من واصف ملف eventfd. .P تظهر جلسة الصدفة التالية تشغيلًا نموذجيًا للبرنامج: .P .in +4n .EX $\fB ./a.out 1 2 4 7 14\fP Child writing 1 to efd Child writing 2 to efd Child writing 4 to efd Child writing 7 to efd Child writing 14 to efd Child completed write loop Parent about to read Parent read 28 (0x1c) from efd .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (eventfd.c) \& .EX #include #include #include #include #include #include #include \& int main(int argc, char *argv[]) { int efd; uint64_t u; ssize_t s; \& if (argc < 2) { fprintf(stderr, "Usage: %s ...\[rs]n", argv[0]); exit(EXIT_FAILURE); } \& efd = eventfd(0, 0); if (efd == \-1) err(EXIT_FAILURE, "eventfd"); \& switch (fork()) { case 0: for (size_t j = 1; j < argc; j++) { printf("Child writing %s to efd\[rs]n", argv[j]); u = strtoull(argv[j], NULL, 0); /* strtoull() allows various bases */ s = write(efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) err(EXIT_FAILURE, "write"); } printf("Child completed write loop\[rs]n"); \& exit(EXIT_SUCCESS); \& default: sleep(2); \& printf("Parent about to read\[rs]n"); s = read(efd, &u, sizeof(uint64_t)); if (s != sizeof(uint64_t)) err(EXIT_FAILURE, "read"); printf("Parent read %w64u (%#w64x) from efd\[rs]n", u, u); exit(EXIT_SUCCESS); \& case \-1: err(EXIT_FAILURE, "fork"); } } .EE .\" SRC END .SH "انظر أيضًا" \fBfutex\fP(2), \fBpipe\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBselect\fP(2), \fBsignalfd\fP(2), \fBtimerfd_create\fP(2), \fBwrite\fP(2), \fBepoll\fP(7), \fBsem_overview\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .