.\" -*- coding: UTF-8 -*- .\" 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 signalfd 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم signalfd \- إنشاء واصف ملف لقبول الإشارات .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint signalfd(int \fP\fIfd\fP\fB, const sigset_t *\fP\fImask\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .SH الوصف تنشئ \fBsignalfd\fP() واصف ملف يمكن استخدامه لقبول الإشارات الموجهة للمستدعي. يوفر هذا بديلاً لاستخدام معالج إشارة أو \fBsigwaitinfo\fP(2)، وله ميزة إمكانية مراقبة واصف الملف بواسطة \fBselect\fP(2) و\fBpoll\fP(2) و\fBepoll\fP(7). .P تحدد الوسيطة \fImask\fP مجموعة الإشارات التي يرغب المستدعي في قبولها عبر واصف الملف. هذه الوسيطة هي مجموعة إشارات يمكن تهيئة محتوياتها باستخدام الكليّات الموصوفة في \fBsigsetops\fP(3). عادةً، يجب حظر مجموعة الإشارات المراد استقبالها عبر واصف الملف باستخدام \fBsigprocmask\fP(2)، لمنع معالجة الإشارات وفقًا لترتيباتها المبدئية. لا يمكن استقبال إشارات \fBSIGKILL\fP أو \fBSIGSTOP\fP عبر واصف ملف signalfd؛ يتم تجاهل هذه الإشارات بصمت إذا تم تحديدها في \fImask\fP. .P إذا كانت الوسيطة \fIfd\fP هي \-1، فإن الاستدعاء ينشئ واصف ملف جديدًا ويربط مجموعة الإشارات المحددة في \fImask\fP بذلك الواصف. إذا لم تكن \fIfd\fP هي \-1، فيجب أن تحدد واصف ملف signalfd موجودًا صالحًا، ويتم استخدام \fImask\fP لاستبدال مجموعة الإشارات المرتبطة بذلك الواصف. .P بدءًا من لينكس 2.6.27، يمكن إجراء عملية OR بتية للقيم التالية في \fIflags\fP لتغيير سلوك \fBsignalfd\fP(): .TP 14 \fBSFD_NONBLOCK\fP اضبط علامة حالة الملف \fBO_NONBLOCK\fP على وصف الملف المفتوح (انظر \fBopen\fP(2)) المشار إليه بواسطة واصف الملف الجديد. استخدام هذه العلامة يوفر استدعاءات إضافية لـ \fBfcntl\fP(2) لتحقيق النتيجة نفسها. .TP \fBSFD_CLOEXEC\fP اضبط علامة الإغلاق عند التنفيذ (\fBFD_CLOEXEC\fP) على واصف الملف الجديد. انظر وصف العلامة \fBO_CLOEXEC\fP في \fBopen\fP(2) للأسباب التي تجعل هذا مفيدًا. .P حتى لينكس 2.6.26، معطى \fIflags\fP غير مستخدم، ويجب تحديده كصفر. .P ترجع \fBsignalfd\fP() واصف ملف يدعم العمليات التالية: .TP \fBread\fP(2) إذا كانت إشارة واحدة أو أكثر من الإشارات المحددة في \fImask\fP معلقة للعملية، يتم استخدام المخزن المؤقت المقدم إلى \fBread\fP(2) لإرجاع بنية أو أكثر من بنى \fIsignalfd_siginfo\fP (انظر أدناه) التي تصف الإشارات. يرجع \fBread\fP(2) معلومات لعدد الإشارات المعلقة والتي تناسب المخزن المؤقت المقدم. يجب أن يكون المخزن المؤقت على الأقل \fIsizeof(struct signalfd_siginfo)\fP بايت. قيمة إرجاع \fBread\fP(2) هي إجمالي عدد البايتات المقروءة. .IP نتيجة لـ \fBread\fP(2)، يتم استهلاك الإشارات، بحيث لا تبقى معلقة للعملية (أي لن يتم التقاطها بواسطة معالجات الإشارات، ولا يمكن قبولها باستخدام \fBsigwaitinfo\fP(2)). .IP إذا لم تكن أي من الإشارات في \fImask\fP معلقة للعملية، فإن \fBread\fP(2) إما أن يحظر حتى يتم توليد إشارة من الإشارات في \fImask\fP للعملية، أو يفشل مع الخطأ \fBEAGAIN\fP إذا تم جعل واصف الملف غير محظور. .TP \fBpoll\fP(2) .TQ \fBselect\fP(2) .TQ (وما شابه ذلك) واصف الملف قابل للقراءة (وسيطة \fBselect\fP(2) \fIreadfds\fP؛ علم \fBpoll\fP(2) \fBPOLLIN\fP) إذا كانت إشارة واحدة أو أكثر من الإشارات في \fImask\fP معلقة للعملية. .IP يدعم واصف ملف signalfd أيضًا واجهات برمجة تطبيقات تعدد إرسال واصفات الملف الأخرى: \fBpselect\fP(2) و\fBppoll\fP(2) و\fBepoll\fP(7). .TP \fBclose\fP(2) عندما لا يكون واصف الملف مطلوبًا بعد الآن، يجب إغلاقه. عندما يتم إغلاق جميع واصفات الملف المرتبطة بنفس كائن signalfd، يتم تحرير موارد الكائن بواسطة النواة. .SS "بنية signalfd_siginfo" تنسيق بنية (بنى) \fIsignalfd_siginfo\fP التي ترجعها عمليات \fBread\fP(2) من واصف ملف signalfd هو كما يلي: .P .in +4n .EX .\" ssi_trapno is unused on most arches .\" ssi_addr_lsb: commit b8aeec34175fc8fe8b0d40efea4846dfc1ba663e struct signalfd_siginfo { uint32_t ssi_signo; /* Signal number */ int32_t ssi_errno; /* Error number (unused) */ int32_t ssi_code; /* Signal code */ uint32_t ssi_pid; /* PID of sender */ uint32_t ssi_uid; /* Real UID of sender */ int32_t ssi_fd; /* File descriptor (SIGIO) */ uint32_t ssi_tid; /* Kernel timer ID (POSIX timers) uint32_t ssi_band; /* Band event (SIGIO) */ uint32_t ssi_overrun; /* POSIX timer overrun count */ uint32_t ssi_trapno; /* Trap number that caused signal */ int32_t ssi_status; /* Exit status or signal (SIGCHLD) */ int32_t ssi_int; /* Integer sent by sigqueue(3) */ uint64_t ssi_ptr; /* Pointer sent by sigqueue(3) */ uint64_t ssi_utime; /* User CPU time consumed (SIGCHLD) */ uint64_t ssi_stime; /* System CPU time consumed (SIGCHLD) */ uint64_t ssi_addr; /* Address that generated signal (for hardware\-generated signals) */ uint16_t ssi_addr_lsb; /* Least significant bit of address (SIGBUS; since Linux 2.6.37) */ uint8_t pad[\f[I]X\fR]; /* Pad size to 128 bytes (allow for additional fields in the future) */ }; .EE .in .P كل حقل من الحقول في هذه البنية مماثل للحقل المسمى بالمثل في بنية \fIsiginfo_t\fP. يتم وصف بنية \fIsiginfo_t\fP في \fBsigaction\fP(2). لن تكون جميع الحقول في بنية \fIsignalfd_siginfo\fP المرتجعة صالحة لإشارة محددة؛ يمكن تحديد مجموعة الحقول الصالحة من القيمة المرتجعة في حقل \fIssi_code\fP. هذا الحقل هو مماثل لحقل \fIsi_code\fP في \fIsiginfo_t\fP؛ انظر \fBsigaction\fP(2) للتفاصيل. .SS "دلالات fork(2)" بعد \fBfork\fP(2)، يرث الطفل نسخة من واصف ملف signalfd. سترجع عملية \fBread\fP(2) من واصف الملف في الطفل معلومات حول الإشارات المنتظرة للطفل. .SS "دلالات تمرير واصف الملف" كما هو الحال مع واصفات الملف الأخرى، يمكن تمرير واصفات ملف signalfd إلى عملية أخرى عبر مقبس نطاق UNIX (انظر \fBunix\fP(7)). في العملية المستقبلة، سترجع عملية \fBread\fP(2) من واصف الملف المستلم معلومات حول الإشارات المنتظرة لتلك العملية. .SS "دلالات execve(2)" تمامًا مثل أي واصف ملف آخر، يظل واصف ملف signalfd مفتوحًا عبر \fBexecve\fP(2)، ما لم يتم وضع علامة عليه للإغلاق عند التنفيذ (انظر \fBfcntl\fP(2)). أي إشارات كانت متاحة للقراءة قبل \fBexecve\fP(2) تظل متاحة للبرنامج المحمل حديثًا. (هذا مماثل لدلالات الإشارات التقليدية، حيث تظل الإشارة المحظورة المعلقة معلقة عبر \fBexecve\fP(2).) .SS "دلالات الخيوط" .\" دلالات واصفات ملف signalfd في برنامج متعدد الخيوط تعكس الدلالات القياسية للإشارات. بعبارة أخرى، عندما يقرأ خيط من واصف ملف signalfd، سيقرأ الإشارات الموجهة للخيط نفسه والإشارات الموجهة للعملية (أي مجموعة الخيوط بأكملها). (لن يتمكن الخيط من قراءة الإشارات الموجهة لخيوط أخرى في العملية.) .SS "دلالات epoll(7)" إذا أضافت عملية ما (عبر \fBepoll_ctl\fP(2)) مُعرف ملف signalfd إلى مثيل \fBepoll\fP(7)، فإن \fBepoll_wait\fP(2) تُرجع الأحداث الخاصة فقط بالإشارات المرسلة إلى تلك العملية. وعلى وجه الخصوص، إذا استخدمت العملية بعد ذلك \fBfork\fP(2) لإنشاء عملية فرعية، فستتمكن العملية الفرعية من \fBread\fP(2) الإشارات المرسلة إليها باستخدام واصف الملف signalfd، ولكن \fBepoll_wait\fP(2) لن تشير إلى أن واصف الملف signalfd جاهز. في هذا السيناريو، هناك حل بديل ممكن وهو أنه بعد \fBfork\fP(2)، يمكن للعملية الفرعية إغلاق واصف الملف signalfd الذي ورثته من العملية الأم ثم إنشاء واصف ملف signalfd آخر وإضافته إلى مثيل epoll. بدلاً من ذلك، يمكن للعملية الأم والعملية الفرعية تأخير إنشاء واصفات ملفات signalfd (المنفصلة) الخاصة بهما وإضافتها إلى مثيل epoll حتى ما بعد استدعاء \fBfork\fP(2). .SH "قيمة الإرجاع" في حالة النجاح، تُرجع الدالة \fBsignalfd\fP() مُعرف ملف signalfd؛ ويكون هذا إما مُعرف ملف جديد (إذا كان \fIfd\fP يساوي \-1)، أو \fIfd\fP نفسه إذا كان \fIfd\fP مُعرف ملف signalfd صالحًا. وفي حالة حدوث خطأ، تُرجع الدالة القيمة \-1 ويتم تعيين \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEBADF\fP وصف الملف \fIfd\fP ليس واصف ملف صالحًا. .TP \fBEINVAL\fP .\" or, the .\" .I sizemask .\" argument is not equal to .\" .IR sizeof(sigset_t) ; \fIfd\fP ليس واصف ملف signalfd صالحًا. .TP \fBEINVAL\fP \fIflags\fP غير صالح؛ أو، في لينكس 2.6.26 أو أقدم، \fIflags\fP ليس صفرًا. .TP \fBEMFILE\fP وُصل إلى الحد الأقصى لواصفات الملفات المفتوحة لكل عملية. .TP \fBENFILE\fP وُصل إلى الحد الأقصى لإجمالي عدد الملفات المفتوحة على مستوى النظام. .TP \fBENODEV\fP تعذر وصل جهاز inode (داخلي) مجهول. .TP \fBENOMEM\fP ذاكرة غير كافية لإنشاء واصف ملف signalfd جديد. .SH الإصدارات .SS "الاختلافات بين مكتبة C والنواة" استدعاء نظام Linux الأساسي يتطلب وسيطة إضافية، \fIsize_t sizemask\fP، التي تحدد حجم وسيطة \fImask\fP. دالة الغلاف \fBsignalfd\fP() في glibc لا تتضمن هذه الوسيطة، لأنها توفر القيمة المطلوبة لاستدعاء النظام الأساسي. .P هناك استدعاءان أساسيان لنظام Linux: \fBsignalfd\fP() والأحدث \fBsignalfd4\fP(). استدعاء النظام الأول لا ينفذ وسيطة \fIflags\fP. استدعاء النظام الثاني ينفذ قيم \fIflags\fP الموصوفة أعلاه. بدءًا من glibc 2.9، ستستخدم دالة الغلاف \fBsignalfd\fP() \fBsignalfd4\fP() حيثما كان متاحًا. .SH المعايير لينكس. .SH التاريخ .TP \fBsignalfd\fP() .\" signalfd() is in glibc 2.7, but reportedly does not build لينكس 2.6.22، glibc 2.8. .TP \fBsignalfd4\fP() لينكس 2.6.27. .SH ملاحظات يمكن لعملية إنشاء واصفات ملف signalfd متعددة. هذا يجعل من الممكن قبول إشارات مختلفة على واصفات ملف مختلفة. (قد يكون هذا مفيدًا إذا كانت مراقبة واصفات الملف باستخدام \fBselect\fP(2) أو \fBpoll\fP(2) أو \fBepoll\fP(7): وصول إشارات مختلفة سيجعل واصفات ملف مختلفة جاهزة.) إذا ظهرت إشارة في \fImask\fP لأكثر من واصف ملف واحد، فيمكن قراءة حدوث تلك الإشارة (مرة واحدة) من أي من واصفات الملف. .P محاولات تضمين \fBSIGKILL\fP و \fBSIGSTOP\fP في \fImask\fP يتم تجاهلها بصمت. .P .\" يمكن عرض قناع الإشارة المستخدم بواسطة واصف ملف signalfd عبر الإدخال لواصف الملف المقابل في دليل \fI/proc/\fPpid\fI/fdinfo\fP للعملية. راجع \fBproc\fP(5) لمزيد من التفاصيل. .SS القيود لا يمكن استخدام آلية signalfd لاستقبال الإشارات المولدة بشكل متزامن، مثل إشارة \fBSIGSEGV\fP الناتجة عن الوصول إلى عنوان ذاكرة غير صالح أو إشارة \fBSIGFPE\fP الناتجة عن خطأ حسابي. يمكن التقاط هذه الإشارات فقط عبر معالج إشارة. .P كما هو موصوف أعلاه، في الاستخدام العادي يقوم المرء بحظر الإشارات التي سيتم قبولها عبر \fBsignalfd\fP(). إذا تم إنشاء عملية فرعية لتنفيذ برنامج مساعد (لا يحتاج إلى واصف ملف signalfd)، فبعد استدعاء \fBfork\fP(2)، سترغب عادةً في إلغاء حظر تلك الإشارات قبل استدعاء \fBexecve\fP(2)، حتى يتمكن البرنامج المساعد من رؤية أي إشارات يتوقع رؤيتها. ومع ذلك، كن على علم أن هذا لن يكون ممكنًا في حالة برنامج مساعد تم إنشاؤه خلف الكواليس بواسطة أي دالة مكتبة قد يستدعيها البرنامج. في مثل هذه الحالات، يجب اللجوء إلى استخدام معالج إشارة تقليدي يكتب إلى واصف ملف يتم مراقبته بواسطة \fBselect\fP(2) أو \fBpoll\fP(2) أو \fBepoll\fP(7). .SH العلل .\" The fix also was put into Linux 2.6.24.5 قبل لينكس 2.6.25، لا يتم ملء حقلي \fIssi_ptr\fP و \fIssi_int\fP بالبيانات المصاحبة لإشارة مرسلة بواسطة \fBsigqueue\fP(3). .SH أمثلة البرنامج أدناه يقبل الإشارات \fBSIGINT\fP و \fBSIGQUIT\fP عبر واصف ملف signalfd. ينتهي البرنامج بعد قبول إشارة \fBSIGQUIT\fP. جلسة الصدفة التالية توضح استخدام البرنامج: .P .in +4n .EX $\fB ./signalfd_demo\fP \fB\[ha]C\fP # Control\-C generates SIGINT Got SIGINT \fB\[ha]C\fP Got SIGINT \fB\[ha]\[rs]\fP # Control\-\[rs] generates SIGQUIT Got SIGQUIT $ .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (signalfd.c) \& .EX #include #include #include #include #include #include #include \& int main(void) { int sfd; ssize_t s; sigset_t mask; struct signalfd_siginfo fdsi; \& sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGQUIT); \& /* Block signals so that they aren\[aq]t handled according to their default dispositions. */ \& if (sigprocmask(SIG_BLOCK, &mask, NULL) == \-1) err(EXIT_FAILURE, "sigprocmask"); \& sfd = signalfd(\-1, &mask, 0); if (sfd == \-1) err(EXIT_FAILURE, "signalfd"); \& for (;;) { s = read(sfd, &fdsi, sizeof(fdsi)); if (s != sizeof(fdsi)) err(EXIT_FAILURE, "read"); \& if (fdsi.ssi_signo == SIGINT) { printf("Got SIGINT\[rs]n"); } else if (fdsi.ssi_signo == SIGQUIT) { printf("Got SIGQUIT\[rs]n"); exit(EXIT_SUCCESS); } else { printf("Read unexpected signal\[rs]n"); } } } .EE .\" SRC END .SH "انظر أيضًا" \fBeventfd\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBselect\fP(2), \fBsigaction\fP(2), \fBsigprocmask\fP(2), \fBsigwaitinfo\fP(2), \fBtimerfd_create\fP(2), \fBsigsetops\fP(3), \fBsigwait\fP(3), \fBepoll\fP(7), \fBsignal\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 .