.\" -*- coding: UTF-8 -*- .\" Copyright 1992, Drew Eckhardt .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH select 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO, fd_set \- تعدد الإرسال المتزامن للإدخال/الإخراج .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBtypedef\fP /* .\|.\|.\& */ \fBfd_set;\fP .P \fBint select(int \fP\fInfds\fP\fB, fd_set *_Nullable restrict \fP\fIreadfds\fP\fB,\fP \fB fd_set *_Nullable restrict \fP\fIwritefds\fP\fB,\fP \fB fd_set *_Nullable restrict \fP\fIexceptfds\fP\fB,\fP \fB struct timeval *_Nullable restrict \fP\fItimeout\fP\fB);\fP .P \fBvoid FD_CLR(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP \fBint FD_ISSET(int \fP\fIfd\fP\fB, const fd_set *\fP\fIset\fP\fB);\fP \fBvoid FD_SET(int \fP\fIfd\fP\fB, fd_set *\fP\fIset\fP\fB);\fP \fBvoid FD_ZERO(fd_set *\fP\fIset\fP\fB);\fP .P \fBint pselect(int \fP\fInfds\fP\fB, fd_set *_Nullable restrict \fP\fIreadfds\fP\fB,\fP \fB fd_set *_Nullable restrict \fP\fIwritefds\fP\fB,\fP \fB fd_set *_Nullable restrict \fP\fIexceptfds\fP\fB,\fP \fB const struct timespec *_Nullable restrict \fP\fItimeout\fP\fB,\fP \fB const sigset_t *_Nullable restrict \fP\fIsigmask\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBpselect\fP(): .nf _POSIX_C_SOURCE >= 200112L .fi .SH الوصف \fBتحذير\fP: \fBselect\fP() يمكنه مراقبة أرقام واصفات الملفات الأقل من \fBFD_SETSIZE\fP (1024) فقط\[em]حد منخفض بشكل غير معقول للعديد من التطبيقات الحديثة\[em]وهذا القيد لن يتغير. يجب على جميع التطبيقات الحديثة استخدام \fBpoll\fP(2) أو \fBepoll\fP(7) بدلاً من ذلك، والتي لا تعاني من هذا القيد. .P .\" \fBselect\fP() يسمح للبرنامج بمراقبة واصفات ملفات متعددة، منتظراً حتى يصبح واحد أو أكثر من واصفات الملفات "جاهزاً" لفئة معينة من عمليات الإدخال/الإخراج (مثل، إدخال ممكن). يعتبر واصف الملف جاهزاً إذا كان من الممكن تنفيذ عملية إدخال/إخراج مقابلة (مثل، \fBread\fP(2)، أو \fBwrite\fP(2) صغير بما يكفي) دون حظر. .SS fd_set .\" نوع بنية يمكنه تمثيل مجموعة من واصفات الملفات. وفقاً لـ POSIX، الحد الأقصى لعدد واصفات الملفات في بنية \fIfd_set\fP هو قيمة الماكرو \fBFD_SETSIZE\fP. .SS "مجموعات واصفات الملفات" الوسائط الرئيسية لـ \fBselect\fP() هي ثلاث "مجموعات" من واصفات الملفات (مُعلنة بالنوع \fIfd_set\fP)، والتي تسمح للمستدعي بالانتظار لثلاث فئات من الأحداث على مجموعة واصفات الملفات المحددة. يمكن تحديد كل وسيطة من \fIfd_set\fP كـ NULL إذا لم تكن هناك واصفات ملفات يجب مراقبتها لفئة الأحداث المقابلة. .P \fBملاحظة مهمة\fP: عند العودة، يتم تعديل كل مجموعة من مجموعات واصفات الملفات في مكانها للإشارة إلى واصفات الملفات الجاهزة حالياً. وبالتالي، إذا تم استخدام \fBselect\fP() داخل حلقة، يجب \fIإعادة تهيئة\fP المجموعات قبل كل استدعاء. .P يمكن معالجة محتويات مجموعة واصفات الملفات باستخدام الماكرو التالية: .TP \fBFD_ZERO\fP() يقوم هذا الماكرو بمسح (إزالة جميع واصفات الملفات من) \fIset\fP. يجب استخدامه كخطوة أولى في تهيئة مجموعة واصفات الملفات. .TP \fBFD_SET\fP() يضيف هذا الماكرو واصف الملف \fIfd\fP إلى \fIset\fP. إضافة واصف ملف موجود بالفعل في المجموعة هو عملية عدم فعل، ولا ينتج عنه خطأ. .TP \fBFD_CLR\fP() يزيل هذا الماكرو واصف الملف \fIfd\fP من \fIset\fP. إزالة واصف ملف غير موجود في المجموعة هو عملية عدم فعل، ولا ينتج عنه خطأ. .TP \fBFD_ISSET\fP() .\" يقوم \fBselect\fP() بتعديل محتويات المجموعات وفقاً للقواعد الموصوفة أدناه. بعد استدعاء \fBselect\fP()، يمكن استخدام الماكرو \fBFD_ISSET\fP() لاختبار ما إذا كان واصف الملف لا يزال موجوداً في مجموعة. يُرجع \fBFD_ISSET\fP() قيمة غير صفرية إذا كان واصف الملف \fIfd\fP موجوداً في \fIset\fP، وصفراً إذا لم يكن كذلك. .SS المعطيات وسائط \fBselect\fP() هي كما يلي: .TP \fIreadfds\fP يتم مراقبة واصفات الملفات في هذه المجموعة لمعرفة ما إذا كانت جاهزة للقراءة. واصف الملف جاهز للقراءة إذا كانت عملية القراءة لن تحظر؛ على وجه الخصوص، واصف الملف جاهز أيضًا عند نهاية الملف. .IP بعد أن يعود \fBselect\fP()، سيتم مسح \fIreadfds\fP من جميع واصفات الملفات باستثناء تلك الجاهزة للقراءة. .TP \fIwritefds\fP يتم مراقبة واصفات الملفات في هذه المجموعة لمعرفة ما إذا كانت جاهزة للكتابة. واصف الملف جاهز للكتابة إذا كانت عملية الكتابة لن تحظر. ومع ذلك، حتى إذا أشار واصف الملف إلى أنه قابل للكتابة، فقد تظل الكتابة الكبيرة تحظر. .IP بعد أن يعود \fBselect\fP()، سيتم مسح \fIwritefds\fP من جميع واصفات الملفات باستثناء تلك الجاهزة للكتابة. .TP \fIexceptfds\fP يتم مراقبة واصفات الملفات في هذه المجموعة لـ "ظروف استثنائية". للحصول على أمثلة لبعض الظروف الاستثنائية، انظر مناقشة \fBPOLLPRI\fP في \fBpoll\fP(2). .IP بعد أن يعود \fBselect\fP()، سيتم مسح \fIexceptfds\fP من جميع واصفات الملفات باستثناء تلك التي حدثت لها حالة استثنائية. .TP \fInfds\fP يجب تعيين هذه الوسيطة إلى أعلى واصف ملف مرقم في أي من المجموعات الثلاث، زائد 1. يتم فحص واصفات الملفات المشار إليها في كل مجموعة، حتى هذا الحد (ولكن انظر الأخطاء). .TP \fItimeout\fP وسيطة \fItimeout\fP هي بنية \fItimeval\fP (موضحة أدناه) تحدد الفاصل الزمني الذي يجب أن يحظر فيه \fBselect\fP() منتظراً حتى يصبح واصف الملف جاهزاً. سوف يحظر الاستدعاء حتى: .RS .IP \[bu] 3 يصبح واصف الملف جاهزًا؛ .IP \[bu] الاستدعاء قوطع بواسطة معالج إشارة؛ أو .IP \[bu] انتهاء المهلة. .RE .IP لاحظ أن فاصل \fItimeout\fP سيتم تقريبه لأعلى إلى دقة ساعة النظام، وتأخيرات جدولة النواة تعني أن فاصل الحظر قد يتجاوز بمقدار صغير. .IP إذا كان كلا حقلي بنية \fItimeval\fP صفراً، فإن \fBselect\fP() يعود فوراً. (هذا مفيد للاستقصاء.) .IP .\" إذا تم تحديد \fItimeout\fP كـ NULL، فإن \fBselect\fP() يحظر إلى أجل غير مسمى منتظراً حتى يصبح واصف الملف جاهزاً. .SS pselect() استدعاء النظام \fBpselect\fP() يسمح للتطبيق بالانتظار بأمان حتى يصبح واصف الملف جاهزاً أو حتى يتم التقاط إشارة. .P عملية \fBselect\fP() و \fBpselect\fP() متطابقة، باستثناء هذه الاختلافات الثلاثة: .IP \[bu] 3 تستخدم \fBselect\fP() مهلة زمنية من النوع \fIstruct timeval\fP (مع الثواني والميكروثواني)، بينما تستخدم \fBpselect\fP() النوع \fIstruct timespec\fP (مع الثواني والنانوثواني). .IP \[bu] قد تحدّث \fBselect\fP() الوسيط \fItimeout\fP للإشارة إلى مقدار الوقت المتبقي. لا تغيّر \fBpselect\fP() هذه الوسيط. .IP \[bu] لا تحتوي \fBselect\fP() على وسيط \fIsigmask\fP، وتتصرف مثل \fBpselect\fP() التي استُدعيت مع \fIsigmask\fP بقيمة NULL. .P \fIsigmask\fP هو مؤشر لقناع إشارة (انظر \fBsigprocmask\fP(2))؛ إذا لم يكن NULL، فإن \fBpselect\fP() تستبدل أولاً قناع الإشارة الحالي بالقناع المشار إليه بواسطة \fIsigmask\fP، ثم تؤدي وظيفة "select"، ثم تستعيد قناع الإشارة الأصلي. (إذا كان \fIsigmask\fP هو NULL، لا يُعدّل قناع الإشارة أثناء استدعاء \fBpselect\fP().) .P بخلاف الاختلاف في دقة وسيط \fItimeout\fP، فإن استدعاء \fBpselect\fP() التالي: .P .in +4n .EX ready = pselect(nfds, &readfds, &writefds, &exceptfds, timeout, &sigmask); .EE .in .P يعادل تنفيذ الاستدعاءات التالية \fIبشكل ذري\fP: .P .in +4n .EX sigset_t origmask; \& pthread_sigmask(SIG_SETMASK, &sigmask, &origmask); ready = select(nfds, &readfds, &writefds, &exceptfds, timeout); pthread_sigmask(SIG_SETMASK, &origmask, NULL); .EE .in .P سبب الحاجة إلى \fBpselect\fP() هو أنه إذا أراد المرء الانتظار إما لإشارة أو لوصف ملف ليصبح جاهزًا، فإن اختبارًا ذريًا ضروري لمنع حالات السباق. (افترض أن معالج الإشارة يضع علامة عامة ويعود. ثم اختبار هذه العلامة العامة متبوعًا باستدعاء \fBselect\fP() قد يتعطل إلى أجل غير مسمى إذا وصلت الإشارة بعد الاختبار مباشرة ولكن قبل الاستدعاء. على النقيض، تسمح \fBpselect\fP() للمرء أولاً بحظر الإشارات، ومعالجة الإشارات التي وصلت، ثم استدعاء \fBpselect\fP() مع \fIsigmask\fP المطلوب، متجنبًا السباق.) .SS "المهلة الزمنية" وسيط \fItimeout\fP لـ \fBselect\fP() هو بنية من النوع التالي: .P .in +4n .EX struct timeval { time_t tv_sec; /* seconds */ suseconds_t tv_usec; /* microseconds */ }; .EE .in .P الوسيط المقابل لـ \fBpselect\fP() هو بنية \fBtimespec\fP(3). .P .\" .P - it is rumored that: .\" On BSD, when a timeout occurs, the file descriptor bits are not changed. .\" - it is certainly true that: .\" Linux follows SUSv2 and sets the bit masks to zero upon a timeout. في لينكس، تعدل \fBselect\fP() \fItimeout\fP لتعكس مقدار الوقت غير المُنام؛ معظم التطبيقات الأخرى لا تفعل هذا. (يسمح POSIX.1 بأي من السلوكين.) يسبب هذا مشاكل سواء عندما يُنقل كود لينكس الذي يقرأ \fItimeout\fP إلى أنظمة تشغيل أخرى، وعندما يُنقل كود إلى لينكس يعيد استخدام \fIstruct\ timeval\fP لعدة \fBselect\fP()s في حلقة دون إعادة تهيئته. اعتبر \fItimeout\fP غير معرف بعد عودة \fBselect\fP(). .SH "قيمة الإرجاع" عند النجاح، تُرجع \fBselect\fP() و \fBpselect\fP() عدد واصفات الملفات الموجودة في مجموعات الواصفات الثلاث المُعادة (أي العدد الإجمالي للبتات المُعيّنة في \fIreadfds\fP و \fIwritefds\fP و \fIexceptfds\fP). قد تكون قيمة الإرجاع صفرًا إذا انتهت المهلة الزمنية قبل أن يصبح أي واصف ملف جاهزًا. .P عند الخطأ، تُعاد \-1، ويُعيّن \fIerrno\fP للإشارة إلى الخطأ؛ تبقى مجموعات واصفات الملفات دون تعديل، ويصبح \fItimeout\fP غير معرف. .SH الأخطاء .TP \fBEBADF\fP وُجد واصف ملف غير صالح في إحدى المجموعات. (ربما واصف ملف أُغلق بالفعل، أو واصف حدث فيه خطأ.) ومع ذلك، انظر الأخطاء. .TP \fBEINTR\fP اُلتُقطت إشارة؛ انظر \fBsignal\fP(7). .TP \fBEINVAL\fP \fInfds\fP سالب أو يتجاوز حد المورد \fBRLIMIT_NOFILE\fP (انظر \fBgetrlimit\fP(2)). .TP \fBEINVAL\fP القيمة الموجودة داخل \fItimeout\fP غير صالحة. .TP \fBENOMEM\fP غير قادر على تخصيص ذاكرة للجداول الداخلية. .SH الإصدارات .\" Darwin, according to a report by Jeremy Sequoia, relayed by Josh Triplett في بعض أنظمة UNIX الأخرى، قد تفشل \fBselect\fP() مع الخطأ \fBEAGAIN\fP إذا فشل النظام في تخصيص موارد داخلية للنواة، بدلاً من \fBENOMEM\fP كما يفعل لينكس. يحدد POSIX هذا الخطأ لـ \fBpoll\fP(2)، ولكن ليس لـ \fBselect\fP(). قد ترغب البرامج المحمولة في التحقق من \fBEAGAIN\fP والتكرار، تمامًا كما هو الحال مع \fBEINTR\fP. .SH المعايير POSIX.1\-2024. .SH التاريخ .TP \fBselect\fP() POSIX.1\-2001،‏ 4.4BSD (ظهر أولاً في 4.2BSD). .IP يمكن نقلها عمومًا من وإلى الأنظمة غير التابعة لنظام BSD التي تدعم نسخًا مطابقة لطبقة مآخذ BSD (بما في ذلك متغيرات System V). ومع ذلك، تجدر الإشارة إلى أن متغير System V عادةً ما يقوم بتعيين متغير المهلة قبل العودة، بينما لا يقوم متغير BSD بذلك. .TP \fBpselect\fP() لينكس 2.6.16. POSIX.1g, POSIX.1\-2001. .IP قبل ذلك، كان يُحاكى في glibc (ولكن انظر الأخطاء). .TP \fBfd_set\fP POSIX.1\-2001. .SH ملاحظات الملف الرأسي التالي يوفر أيضًا النوع \fIfd_set\fP: \fI\fP. .P \fIfd_set\fP هو مخزن ثابت الحجم. تنفيذ \fBFD_CLR\fP() أو \fBFD_SET\fP() بقيمة \fIfd\fP سالبة أو تساوي أو أكبر من \fBFD_SETSIZE\fP سيؤدي إلى سلوك غير معرف. علاوة على ذلك، يتطلب POSIX أن يكون \fIfd\fP واصف ملف صالحًا. .P .\" لا يتأثر تشغيل \fBselect\fP() و \fBpselect\fP() بالعلامة \fBO_NONBLOCK\fP. .SS "خدعة الأنبوب الذاتي" .\" في الأنظمة التي تفتقر إلى \fBpselect\fP()، يمكن تحقيق التقاط إشارة موثوق (وأكثر قابلية للنقل) باستخدام خدعة الأنبوب الذاتي. في هذه التقنية، يكتب معالج الإشارة بايتًا إلى أنبوب يُراقب طرفه الآخر بواسطة \fBselect\fP() في البرنامج الرئيسي. (لتجنب الحظر المحتمل عند الكتابة إلى أنبوب قد يكون ممتلئًا أو القراءة من أنبوب قد يكون فارغًا، يُستخدم الإدخال/الإخراج غير المحظور عند القراءة من والكتابة إلى الأنبوب.) .SS "محاكاة usleep(3)" .\" قبل ظهور \fBusleep\fP(3)، استخدم بعض الكود استدعاءً لـ \fBselect\fP() مع جميع المجموعات الثلاث فارغة، \fInfds\fP صفر، و \fItimeout\fP غير NULL كطريقة قابلة للنقل بشكل معقول للنوم بدقة دون الثانية. .SS "التوافق بين إشعارات select() و poll()" .\" fs/select.c داخل مصدر نواة لينكس، نجد التعريفات التالية التي تُظهر التوافق بين إشعارات الحالة القابلة للقراءة والقابلة للكتابة والاستثنائية لـ \fBselect\fP() وإشعارات الأحداث التي توفرها \fBpoll\fP(2) و \fBepoll\fP(7): .P .in +4n .EX #define POLLIN_SET (EPOLLRDNORM | EPOLLRDBAND | EPOLLIN | EPOLLHUP | EPOLLERR) /* Ready for reading */ #define POLLOUT_SET (EPOLLWRBAND | EPOLLWRNORM | EPOLLOUT | EPOLLERR) /* Ready for writing */ #define POLLEX_SET (EPOLLPRI) /* Exceptional condition */ .EE .in .\" .SS "التطبيقات متعددة الخيوط" .\" إذا أُغلق واصف ملف تراقبه \fBselect\fP() في خيط آخر، فالنتيجة غير محددة. في بعض أنظمة UNIX، تفك \fBselect\fP() الحظر وتعود، مع إشارة أن واصف الملف جاهز (ستفشل عملية الإدخال/الإخراج اللاحقة غالبًا بخطأ، ما لم يفتح عملية أخرى واصف الملف بين وقت عودة \fBselect\fP() وتنفيذ عملية الإدخال/الإخراج). في لينكس (وبعض الأنظمة الأخرى)، لا يؤثر إغلاق واصف الملف في خيط آخر على \fBselect\fP(). باختصار، أي تطبيق يعتمد على سلوك معين في هذا السيناريو يجب اعتباره معطوبًا. .SS "الاختلافات بين مكتبة C والنواة" يسمح نواة لينكس بمجموعات واصفات ملفات ذات حجم عشوائي، محددًا طول المجموعات المراد فحصها من قيمة \fInfds\fP. لكن، في تطبيق glibc، النوع \fIfd_set\fP ثابت الحجم. انظر أيضًا الأخطاء. .P واجهة \fBpselect\fP() الموصوفة في هذه الصفحة منفذة بواسطة glibc. استدعاء نظام لينكس الأساسي يُسمى \fBpselect6\fP(). هذا الاستدعاء له سلوك مختلف قليلاً عن دالة الغلاف glibc. .P يعدل استدعاء نظام لينكس \fBpselect6\fP() وسيطته \fItimeout\fP. لكن، دالة غلاف glibc تخفي هذا السلوك باستخدام متغير محلي لوسيطة timeout التي تُمرر لاستدعاء النظام. وبالتالي، دالة glibc \fBpselect\fP() لا تعدل وسيطتها \fItimeout\fP؛ هذا هو السلوك المطلوب بواسطة POSIX.1\-2001. .P الوسيطة الأخيرة لاستدعاء النظام \fBpselect6\fP() ليست مؤشر \fIsigset_t\ *\fP، بل هي بنية بالشكل: .P .in +4n .EX struct { const kernel_sigset_t *ss; /* Pointer to signal set */ size_t ss_len; /* Size (in bytes) of object pointed to by \[aq]ss\[aq] */ }; .EE .in .P .\" يسمح هذا لاستدعاء النظام بالحصول على كل من مؤشر لمجموعة الإشارات وحجمها، مع مراعاة حقيقة أن معظم البنى تدعم حدًا أقصى 6 وسائط لاستدعاء النظام. انظر \fBsigprocmask\fP(2) لمناقشة الفرق بين مفهوم النواة وlibc لمجموعة الإشارات. .SS "تفاصيل glibc التاريخية" قدم glibc 2.0 نسخة غير صحيحة من \fBpselect\fP() لم تأخذ وسيطة \fIsigmask\fP. .P من glibc 2.1 إلى glibc 2.2.1، يجب تعريف \fB_GNU_SOURCE\fP للحصول على تعريف \fBpselect\fP() من \fI\fP. .SH العلل يسمح POSIX للتطبيق بتعريف حد أعلى، معلن عنه عبر الثابت \fBFD_SETSIZE\fP، على نطاق واصفات الملفات التي يمكن تحديدها في مجموعة واصفات ملفات. لا تفرض نواة لينكس حدًا ثابتًا، لكن تطبيق glibc يجعل \fIfd_set\fP نوعًا ثابت الحجم، مع تعريف \fBFD_SETSIZE\fP كـ 1024، وتعمل وحدات الماكرو \fBFD_*\fP() وفقًا لذلك الحد. لمراقبة واصفات ملفات أكبر من 1023، استخدم \fBpoll\fP(2) أو \fBepoll\fP(7) بدلاً من ذلك. .P تطبيق وسائط \fIfd_set\fP كوسائط قيمة\-نتيجة هو خطأ تصميمي يُتجنب في \fBpoll\fP(2) و \fBepoll\fP(7). .P وفقًا لـ POSIX، يجب على \fBselect\fP() فحص جميع واصفات الملفات المحددة في المجموعات الثلاث لواصفات الملفات، حتى الحد \fInfds\-1\fP. لكن، التطبيق الحالي يتجاهل أي واصف ملف في هذه المجموعات أكبر من رقم واصف الملف الأقصى الذي تمتلكه العملية مفتوحًا حاليًا. وفقًا لـ POSIX، أي واصف ملف كهذا محدد في إحدى المجموعات يجب أن يؤدي إلى الخطأ \fBEBADF\fP. .P بدءًا من glibc 2.1، قدم glibc محاكاة لـ \fBpselect\fP() منفذة باستخدام \fBsigprocmask\fP(2) و \fBselect\fP(). ظل هذا التطبيق عرضة لنفس حالة السباق التي صُممت \fBpselect\fP() لمنعها. تستخدم الإصدارات الحديثة من glibc استدعاء النظام (الخالي من السباق) \fBpselect\fP() على النوى حيث يُوفر. .P .\" Stevens discusses a case where accept can block after select .\" returns successfully because of an intervening RST from the client. .\" Maybe the kernel should have returned EIO in such a situation? في لينكس، قد تُبلغ \fBselect\fP() عن واصف ملف مقبس كـ "جاهز للقراءة"، بينما مع ذلك تقرأ لاحقة تحظر. يمكن أن يحدث هذا مثلاً عندما تصل بيانات ولكن عند الفحص يكون المجموع الاختباري خاطئًا وتُتجاهل. قد تكون هناك ظروف أخرى يُبلغ فيها عن واصف ملف كجاهز بشكل زائف. لذا قد يكون من الأكثر أمانًا استخدام \fBO_NONBLOCK\fP على مقابس لا يجب أن تحظر. .P في لينكس، تعدل \fBselect\fP() أيضًا \fItimeout\fP إذا قاطع معالج إشارة الاستدعاء (أي، إرجاع الخطأ \fBEINTR\fP). هذا غير مسموح به بواسطة POSIX.1. استدعاء نظام لينكس \fBpselect\fP() له نفس السلوك، لكن غلاف glibc يخفي هذا السلوك بنسخ \fItimeout\fP داخليًا إلى متغير محلي وتمرير ذلك المتغير لاستدعاء النظام. .SH أمثلة .\" SRC BEGIN (select.c) .EX #include #include #include #include \& int main(void) { int retval; fd_set rfds; struct timeval tv; \& /* Watch stdin (fd 0) to see when it has input. */ \& FD_ZERO(&rfds); FD_SET(0, &rfds); \& /* Wait up to five seconds. */ \& tv.tv_sec = 5; tv.tv_usec = 0; \& retval = select(1, &rfds, NULL, NULL, &tv); /* Don\[aq]t rely on the value of tv now! */ \& if (retval == \-1) perror("select()"); else if (retval) printf("Data is available now.\[rs]n"); /* FD_ISSET(0, &rfds) will be true. */ else printf("No data within five seconds.\[rs]n"); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBaccept\fP(2), \fBconnect\fP(2), \fBpoll\fP(2), \fBread\fP(2), \fBrecv\fP(2), \fBrestart_syscall\fP(2), \fBsend\fP(2), \fBsigprocmask\fP(2), \fBwrite\fP(2), \fBtimespec\fP(3), \fBepoll\fP(7), \fBtime\fP(7) .P لدروس تعليمية مع مناقشة وأمثلة، انظر \fBselect_tut\fP(2). .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .