.\" -*- coding: UTF-8 -*- .\" Copyright 2005, Michael Kerrisk .\" 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 pipe 7 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم pipe \- نظرة عامة على الأنابيب و FIFOs .SH الوصف توفر الأنابيب و FIFOs (المعروفة أيضًا بالأنابيب المسماة) قناة اتصال أحادية الاتجاه بين العمليات. للأنبوب \fIنهاية قراءة\fP و \fIنهاية كتابة\fP. يمكن قراءة البيانات المكتوبة في نهاية الكتابة للأنبوب من نهاية القراءة للأنبوب. .P يُصنع أنبوب باستخدام \fBpipe\fP(2)، الذي يصنع أنبوبًا جديدًا ويعيد واصفي ملف، أحدهما يشير إلى نهاية القراءة للأنبوب، والآخر يشير إلى نهاية الكتابة. يمكن استخدام الأنابيب لإنشاء قناة اتصال بين العمليات المرتبطة؛ انظر \fBpipe\fP(2) للحصول على مثال. .P FIFO (اختصار لـ First In First Out) له اسم داخل نظام الملفات (يُصنع باستخدام \fBmkfifo\fP(3))، ويُفتح باستخدام \fBopen\fP(2). يمكن لأي عملية فتح FIFO، بافتراض أن أذونات الملف تسمح بذلك. تُفتح نهاية القراءة باستخدام العلم \fBO_RDONLY\fP؛ تُفتح نهاية الكتابة باستخدام العلم \fBO_WRONLY\fP. انظر \fBfifo\fP(7) لمزيد من التفاصيل. \fIملاحظة\fP: على الرغم من أن FIFOs لها اسم مسار في نظام الملفات، فإن الإدخال/الإخراج على FIFOs لا يتضمن عمليات على الجهاز الأساسي (إن وجد). .SS "الإدخال/الإخراج على الأنابيب و FIFOs" الفرق الوحيد بين الأنابيب و FIFOs هو الطريقة التي تُصنع وتُفتح بها. بمجرد إنجاز هذه المهام، يكون للإدخال/الإخراج على الأنابيب و FIFOs نفس الدلالات تمامًا. .P إذا حاولت عملية القراءة من أنبوب فارغ، فإن \fBread\fP(2) سينتظر حتى تتوفر البيانات. إذا حاولت عملية الكتابة إلى أنبوب ممتلئ (انظر أدناه)، فإن \fBwrite\fP(2) ينتظر حتى تُقرأ بيانات كافية من الأنبوب للسماح بإتمام الكتابة. .P الإدخال/الإخراج غير المحظور ممكن باستخدام عملية \fBfcntl\fP(2) \fBF_SETFL\fP لتمكين علم حالة الملف المفتوح \fBO_NONBLOCK\fP أو بفتح \fBfifo\fP(7) مع \fBO_NONBLOCK\fP. إذا كانت أي عملية قد فتحت الأنبوب للكتابة، تفشل القراءات مع \fBEAGAIN\fP؛ وإلا\[em]بدون كتاب محتملين\[em]تنجح القراءات وتعيد فارغة. .P قناة الاتصال التي يوفرها الأنبوب هي \fIتيار بايت\fP: لا يوجد مفهوم لحدود الرسائل. .P إذا أغلقت جميع واصفات الملف التي تشير إلى نهاية الكتابة لأنبوب، فإن محاولة \fBread\fP(2) من الأنبوب سترى نهاية الملف (سيعيد \fBread\fP(2) 0). إذا أغلقت جميع واصفات الملف التي تشير إلى نهاية القراءة لأنبوب، فإن \fBwrite\fP(2) سيسبب توليد إشارة \fBSIGPIPE\fP للعملية المستدعية. إذا كانت العملية المستدعية تتجاهل هذه الإشارة، فإن \fBwrite\fP(2) يفشل مع الخطأ \fBEPIPE\fP. يجب على تطبيق يستخدم \fBpipe\fP(2) و \fBfork\fP(2) استخدام استدعاءات \fBclose\fP(2) مناسبة لإغلاق واصفات الملف المكررة غير الضرورية؛ يضمن هذا تسليم نهاية الملف و \fBSIGPIPE\fP/\fBEPIPE\fP عند الاقتضاء. .P لا يمكن تطبيق \fBlseek\fP(2) على أنبوب. .SS "سعة الأنبوب" للأنبوب سعة محدودة. إذا كان الأنبوب ممتلئًا، فإن \fBwrite\fP(2) سينتظر أو يفشل، اعتمادًا على ما إذا كان العلم \fBO_NONBLOCK\fP مضبوطًا (انظر أدناه). للتطبيقات المختلفة حدود مختلفة لسعة الأنبوب. لا ينبغي للتطبيقات الاعتماد على سعة معينة: يجب تصميم التطبيق بحيث تستهلك عملية القراءة البيانات بمجرد توفرها، بحيث لا تبقى عملية الكتابة محظورة. .P قبل Linux 2.6.11، كانت سعة الأنبوب مماثلة لحجم صفحة النظام (مثل 4096 بايت على i386). منذ Linux 2.6.11، سعة الأنبوب هي 16 صفحة (أي 65,536 بايت في نظام بحجم صفحة 4096 بايت). منذ Linux 2.6.35، السعة المبدئية للأنبوب هي 16 صفحة، ولكن يمكن الاستعلام عن السعة وضبطها باستخدام عمليات \fBfcntl\fP(2) \fBF_GETPIPE_SZ\fP و \fBF_SETPIPE_SZ\fP. انظر \fBfcntl\fP(2) لمزيد من المعلومات. منذ Linux 4.5، السعة المبدئية للأنبوب أقل من 16 صفحة عندما يتجاوز حد \fIpipe\-user\-pages\-soft\fP. .P عملية \fBioctl\fP(2) التالية، التي يمكن تطبيقها على واصف ملف يشير إلى أي من طرفي الأنبوب، تضع عدد البايتات غير المقروءة في الأنبوب في المخزن المؤقت \fIint\fP المشار إليه بالوسيطة الأخيرة للاستدعاء: .P .in +4n .EX ioctl(fd, FIONREAD, &nbytes); .EE .in .P .\" عملية \fBFIONREAD\fP غير محددة في أي معيار، ولكنها متوفرة في العديد من التطبيقات. .SS "ملفات /proc" على Linux، تتحكم الملفات التالية في مقدار الذاكرة التي يمكن استخدامها للأنابيب: .TP \fI/proc/sys/fs/pipe\-max\-pages\fP (فقط في Linux 2.6.34) .\" commit b492e95be0ae672922f4734acf3f5d35c30be948 حد أعلى، بالصفحات، على السعة التي يمكن لمستخدم غير مميز (بدون قدرة \fBCAP_SYS_RESOURCE\fP) ضبطها لأنبوب. .IP القيمة المبدئية لهذا الحد هي 16 ضعف السعة المبدئية للأنبوب (انظر أعلاه)؛ الحد الأدنى هو صفحتان. .IP أزيلت هذه الواجهة في Linux 2.6.35، لصالح \fI/proc/sys/fs/pipe\-max\-size\fP. .TP \fI/proc/sys/fs/pipe\-max\-size\fP (منذ لينكس 2.6.35) .\" commit ff9da691c0498ff81fdd014e7a0731dab2337dac .\" This limit is not checked on pipe creation, where the capacity is .\" always PIPE_DEF_BUFS, regardless of pipe-max-size الحجم الأقصى (بالبايت) للأنابيب الفردية التي يمكن للمستخدمين ضبطها بدون قدرة \fBCAP_SYS_RESOURCE\fP. قد تُقرَّب القيمة المخصصة لهذا الملف لأعلى، لتعكس القيمة المستخدمة فعليًا لتطبيق مناسب. لتحديد القيمة المقربة لأعلى، اعرض محتويات هذا الملف بعد تخصيص قيمة له. .IP القيمة المبدئية لهذا الملف هي 1048576 (1\ ميبايت). القيمة الدنيا التي يمكن تخصيصها لهذا الملف هي حجم صفحة النظام. تؤدي محاولات ضبط حد أقل من حجم الصفحة إلى فشل \fBwrite\fP(2) مع الخطأ \fBEINVAL\fP. .IP .\" commit 086e774a57fba4695f14383c0818994c0b31da7c منذ Linux 4.9، تعمل القيمة في هذا الملف أيضًا كسقف للسعة المبدئية لأنبوب جديد أو FIFO مفتوح حديثًا. .TP \fI/proc/sys/fs/pipe\-user\-pages\-hard\fP (منذ لينكس 4.5) .\" commit 759c01142a5d0f364a462346168a56de28a80f52 الحد الصارم على الحجم الإجمالي (بالصفحات) لجميع الأنابيب المنشأة أو المحددة بواسطة مستخدم واحد غير مميز (أي، شخص لا يملك صلاحية \fBCAP_SYS_RESOURCE\fP ولا صلاحية \fBCAP_SYS_ADMIN\fP). طالما أن العدد الإجمالي للصفحات المخصصة لمخازن الأنابيب لهذا المستخدم يصل إلى هذا الحد، سيُرفض إنشاء أنابيب جديدة، وسيُرفض زيادة سعة الأنبوب. .IP .\" The default was chosen to avoid breaking existing applications that .\" make intensive use of pipes (e.g., for splicing). عندما تكون قيمة هذا الحد صفرًا (وهو المبدئي)، لا يُطبق أي حد صارم. .TP \fI/proc/sys/fs/pipe\-user\-pages\-soft\fP (منذ لينكس 4.5) .\" commit 759c01142a5d0f364a462346168a56de28a80f52 الحد المرن على الحجم الإجمالي (بالصفحات) لجميع الأنابيب المنشأة أو المحددة بواسطة مستخدم واحد غير مميز (أي، شخص لا يملك صلاحية \fBCAP_SYS_RESOURCE\fP ولا صلاحية \fBCAP_SYS_ADMIN\fP). طالما أن العدد الإجمالي للصفحات المخصصة لمخازن الأنابيب لهذا المستخدم يصل إلى هذا الحد، ستُحدد الأنابيب الفردية المنشأة بواسطة المستخدم بصفحتين (صفحة واحدة قبل لينكس 5.14)، وسيُرفض زيادة سعة الأنبوب. .IP عندما تكون قيمة هذا الحد صفرًا، لا يُطبق أي حد مرن. القيمة المبدئية لهذا الملف هي 16384، مما يسمح بإنشاء ما يصل إلى 1024 أنبوبًا بالسعة المبدئية. .P .\" قبل لينكس 4.9، أثرت بعض الأخطاء على معالجة الحدين \fIpipe\-user\-pages\-soft\fP و \fIpipe\-user\-pages\-hard\fP؛ انظر BUGS. .SS PIPE_BUF ينص POSIX.1 على أن عمليات الكتابة الأقل من \fBPIPE_BUF\fP بايت يجب أن تكون ذرية: تُكتب بيانات الإخراج إلى الأنبوب كتسلسل متصل. قد تكون عمليات الكتابة الأكبر من \fBPIPE_BUF\fP بايت غير ذرية: قد تخلط النواة البيانات مع البيانات المكتوبة بواسطة عمليات أخرى. يتطلب POSIX.1 أن يكون \fBPIPE_BUF\fP على الأقل 512 بايت. (على لينكس، \fBPIPE_BUF\fP هو 4096 بايت.) تعتمد الدلالات الدقيقة على ما إذا كان واصف الملف غير محظور (\fBO_NONBLOCK\fP)، وما إذا كان هناك عدة كتّاب للأنبوب، وعلى \fIn\fP، عدد البايتات المراد كتابتها: .TP \fBO_NONBLOCK\fP معطل، \f[I]n\fR <= \fBPIPE_BUF\fP تُكتب جميع بايتات \fIn\fP بشكل ذري؛ قد يحجب \fBwrite\fP(2) إذا لم تكن هناك مساحة كافية لكتابة \fIn\fP بايت فورًا .TP \fBO_NONBLOCK\fP مفعل، \f[I]n\fR <= \fBPIPE_BUF\fP إذا كانت هناك مساحة لكتابة \fIn\fP بايت إلى الأنبوب، فإن \fBwrite\fP(2) ينجح فورًا، كاتبًا جميع بايتات \fIn\fP؛ وإلا يفشل \fBwrite\fP(2)، مع تعيين \fIerrno\fP إلى \fBEAGAIN\fP. .TP \fBO_NONBLOCK\fP معطل، \f[I]n\fR > \fBPIPE_BUF\fP الكتابة غير ذرية: قد تُخلط البيانات المعطاة لـ \fBwrite\fP(2) مع عمليات \fBwrite\fP(2) بواسطة عمليات أخرى؛ يحجب \fBwrite\fP(2) حتى تُكتب \fIn\fP بايت. .TP \fBO_NONBLOCK\fP مفعل، \f[I]n\fR > \fBPIPE_BUF\fP إذا كان الأنبوب ممتلئًا، فإن \fBwrite\fP(2) يفشل، مع تعيين \fIerrno\fP إلى \fBEAGAIN\fP. وإلا، قد تُكتب من 1 إلى \fIn\fP بايت (أي، قد تحدث "كتابة جزئية"؛ يجب على المستدعي التحقق من القيمة المعادة من \fBwrite\fP(2) لمعرفة عدد البايتات التي كُتبت فعليًا)، وقد تُخلط هذه البايتات مع كتابات بواسطة عمليات أخرى. .SS "أعلام حالة الملف المفتوح" أعلام حالة الملف المفتوح الوحيدة التي يمكن تطبيقها بشكل ذي معنى على أنبوب أو FIFO هي \fBO_NONBLOCK\fP و \fBO_ASYNC\fP. .P تعيين علم \fBO_ASYNC\fP لنهاية القراءة لأنبوب يتسبب في توليد إشارة (\fBSIGIO\fP مبدئيًا) عندما يصبح إدخال جديد متاحًا على الأنبوب. يجب تعيين الهدف لتسليم الإشارات باستخدام أمر \fBfcntl\fP(2) \fBF_SETOWN\fP. على لينكس، يُدعم \fBO_ASYNC\fP للأنابيب و FIFOs فقط منذ لينكس 2.6. .SS "ملاحظات حول قابلية النقل" على بعض الأنظمة (ولكن ليس لينكس)، الأنابيب ثنائية الاتجاه: يمكن نقل البيانات في كلا الاتجاهين بين نهايتي الأنبوب. يتطلب POSIX.1 أنابيب أحادية الاتجاه فقط. يجب على التطبيقات المحمولة تجنب الاعتماد على دلالات الأنابيب ثنائية الاتجاه. .SS العلل .\" These bugs where remedied by a series of patches, in particular, .\" commit b0b91d18e2e97b741b294af9333824ecc3fadfd8 and .\" commit a005ca0e6813e1d796a7422a7e31d8b8d6555df1 قبل لينكس 4.9، أثرت بعض الأخطاء على معالجة الحدين \fIpipe\-user\-pages\-soft\fP و \fIpipe\-user\-pages\-hard\fP عند استخدام عملية \fBfcntl\fP(2) \fBF_SETPIPE_SZ\fP لتغيير سعة الأنبوب: .IP (أ) 5 عند زيادة سعة الأنبوب، كانت الفحوصات ضد الحدين المرن والصارم تُجرى مقابل الاستهلاك الحالي، وتستثني الذاكرة المطلوبة لزيادة سعة الأنبوب. قد تؤدي الزيادة الجديدة في سعة الأنبوب بعد ذلك إلى دفع إجمالي الذاكرة المستخدمة بواسطة المستخدم للأنابيب (ربما بشكل كبير) فوق حد. (قد يؤدي هذا أيضًا إلى إثارة المشكلة الموصوفة تاليًا.) .IP بدءًا من لينكس 4.9، يتضمن فحص الحد الذاكرة المطلوبة لسعة الأنبوب الجديدة. .IP (ب) كانت فحوصات الحد تُجرى حتى عندما كانت سعة الأنبوب الجديدة أقل من سعة الأنبوب الحالية. قد يؤدي هذا إلى مشاكل إذا قام مستخدم بتعيين سعة أنبوب كبيرة، ثم خُفضت الحدود، مما يؤدي إلى عدم قدرة المستخدم على تقليل سعة الأنبوب. .IP بدءًا من لينكس 4.9، تُجرى فحوصات ضد الحدود فقط عند زيادة سعة الأنبوب؛ يمكن للمستخدم غير المميز دائمًا تقليل سعة الأنبوب. .IP (ج) كانت المحاسبة والفحص ضد الحدود تُجرى على النحو التالي: .RS .IP (1) 5 .PD 0 اختبار ما إذا كان المستخدم قد تجاوز الحد. .IP (2) إجراء تخصيص وسادة الأنبوب الجديدة. .IP (3) احتساب التخصيص الجديد مقابل الحدود. .PD .RE .IP كان هذا سباقيًا. يمكن لعمليات متعددة اجتياز النقطة (1) في وقت واحد، ثم تخصيص وسائد أنبوب تم احتسابها فقط في الخطوة (3)، مما يؤدي إلى تجاوز تخصيص وسادة الأنبوب للمستخدم للحد. .IP بدءًا من لينكس 4.9، تُنفّذ خطوة الاحتساب قبل إجراء التخصيص، وتفشل العملية إذا تجاوز الحد. .P قبل لينكس 4.9، قد تحدث أخطاء مشابهة للنقطتين (أ) و(ج) أيضًا عندما يخصص النواة ذاكرة لوسادة أنبوب جديدة؛ أي عند استدعاء \fBpipe\fP(2) وعند فتح FIFO لم يُفتح سابقًا. .SH "انظر أيضًا" \fBmkfifo\fP(1), \fBdup\fP(2), \fBfcntl\fP(2), \fBopen\fP(2), \fBpipe\fP(2), \fBpoll\fP(2), \fBselect\fP(2), \fBsocketpair\fP(2), \fBsplice\fP(2), \fBstat\fP(2), \fBtee\fP(2), \fBvmsplice\fP(2), \fBmkfifo\fP(3), \fBepoll\fP(7), \fBfifo\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 .