.\" -*- coding: UTF-8 -*- .\" Copyright 2006, Jens Axboe .\" Copyright 2006, 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 splice 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم splice \- وصل البيانات من/إلى أنبوب .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#define _GNU_SOURCE\fP /* انظر feature_test_macros(7) */ \fB#define _FILE_OFFSET_BITS 64\fP \fB#include \fP .P .\" Return type was long before glibc 2.7 \fBssize_t splice(int \fP\fIfd_in\fP\fB, off_t *_Nullable \fP\fIoff_in\fP\fB,\fP \fB int \fP\fIfd_out\fP\fB, off_t *_Nullable \fP\fIoff_out\fP\fB,\fP \fB size_t \fP\fIsize\fP\fB, unsigned int \fP\fIflags\fP\fB);\fP .fi .SH الوصف تنقل \fBsplice\fP() البيانات بين واصفي ملف دون نسخ بين مساحة عنوان النواة ومساحة عنوان المستخدم. تنقل حتى \fIsize\fP بايت من البيانات من واصف الملف \fIfd_in\fP إلى واصف الملف \fIfd_out\fP، حيث يجب أن يشير أحد واصفي الملف إلى أنبوب. .P تنطبق الدلالات التالية على \fIfd_in\fP و \fIoff_in\fP: .IP \[bu] 3 إذا كان \fIfd_in\fP يشير إلى أنبوب، فيجب أن يكون \fIoff_in\fP NULL. .IP \[bu] إذا كان \fIfd_in\fP لا يشير إلى أنبوب وكان \fIoff_in\fP NULL، تُقرأ البايتات من \fIfd_in\fP بدءًا من إزاحة الملف، وتُضبط إزاحة الملف بشكل مناسب. .IP \[bu] إذا كان \fIfd_in\fP لا يشير إلى أنبوب وكان \fIoff_in\fP ليس NULL، فيجب أن يشير \fIoff_in\fP إلى مخزن مؤقت يحدد الإزاحة الابتدائية التي ستُقرأ منها البايتات من \fIfd_in\fP؛ في هذه الحالة، لا تتغير إزاحة ملف \fIfd_in\fP، وتُضبط الإزاحة المشار إليها بواسطة \fIoff_in\fP بدلاً من ذلك. .P تنطبق عبارات مماثلة على \fIfd_out\fP و \fIoff_out\fP. .P المعامل \fIflags\fP هو قناع بتات (bit mask) يتكون من دمج صفر أو أكثر من القيم التالية باستخدام عملية OR المنطقية: .TP \fBSPLICE_F_MOVE\fP محاولة نقل الصفحات بدلاً من نسخها. هذا مجرد تلميح للنواة: قد تُنسخ الصفحات إذا لم تستطع النواة نقل الصفحات من الأنبوب، أو إذا كانت مخازن الأنبوب المؤقتة لا تشير إلى صفحات كاملة. كان التنفيذ الأولي لهذه العلامة معيبًا: لذلك بدءًا من Linux 2.6.21 أصبحت بلا تأثير (ولكنها لا تزال مسموحة في استدعاء \fBsplice\fP())؛ في المستقبل، قد يُستعاد تنفيذ صحيح. .TP \fBSPLICE_F_NONBLOCK\fP لا تحجب على الإدخال/الإخراج. هذا يجعل عمليات أنبوب splice غير محجوبة، ولكن \fBsplice\fP() قد تحجب مع ذلك لأن واصفات الملف التي يتم الوصل منها/إليها قد تحجب (ما لم تكن تحتوي على العلامة \fBO_NONBLOCK\fP). .TP \fBSPLICE_F_MORE\fP ستأتي بيانات إضافية في splice لاحق. هذا تلميح مفيد عندما يشير \fIfd_out\fP إلى مقبس (انظر أيضًا وصف \fBMSG_MORE\fP في \fBsend\fP(2)، ووصف \fBTCP_CORK\fP في \fBtcp\fP(7)). .TP \fBSPLICE_F_GIFT\fP غير مستخدم لـ \fBsplice\fP()؛ انظر \fBvmsplice\fP(2). .SH "قيمة الإرجاع" عند الإكمال بنجاح، تُرجع \fBsplice\fP() عدد البايتات التي تم وصلها إلى أو من الأنبوب. .P قيمة الإرجاع 0 تعني نهاية الإدخال. إذا كان \fIfd_in\fP يشير إلى أنبوب، فهذا يعني عدم وجود بيانات للنقل، ولن يكون من المنطقي الحجب لأنه لا توجد كتّاب متصلون بنهاية الكتابة للأنبوب. .P عند الخطأ، تُرجع \fBsplice\fP() \-1 ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEAGAIN\fP حُدد \fBSPLICE_F_NONBLOCK\fP في \fIflags\fP أو وُسم أحد واصفات الملفات على أنه غير مانع (\fBO_NONBLOCK\fP)\fB،\fP وكانت العملية ستمنع. .TP \fBEBADF\fP واصف ملف واحد أو كلاهما غير صالح، أو ليس لديه وضع قراءة\-كتابة مناسب. .TP \fBEINVAL\fP نظام الملفات الهدف لا يدعم الوصل. .TP \fBEINVAL\fP .\" The append-mode error is given since Linux 2.6.27; in earlier kernels, .\" splice() in append mode was broken الملف الهدف مفتوح في وضع الإلحاق. .TP \fBEINVAL\fP لا يشير أي من واصفي الملف إلى أنبوب. .TP \fBEINVAL\fP أُعطيت إزاحة لجهاز غير قابل للبحث (مثل أنبوب). .TP \fBEINVAL\fP يشير \fIfd_in\fP و \fIfd_out\fP إلى نفس الأنبوب. .TP \fBENOMEM\fP نفدت الذاكرة. .TP \fBESPIPE\fP إما \fIoff_in\fP أو \fIoff_out\fP لم يكن NULL، ولكن واصف الملف المقابل يشير إلى أنبوب. .SH المعايير لينكس. .SH التاريخ لينكس 2.6.17، glibc 2.5. .P .\" commit 7c77f0b3f9208c339a4b40737bb2cb0f0319bb8d في Linux 2.6.30 والإصدارات الأقدم، كان مطلوبًا أن يكون واحد بالضبط من \fIfd_in\fP و \fIfd_out\fP أنبوبًا. منذ Linux 2.6.31، قد يشير كلا الوسيطين إلى أنابيب. .SH ملاحظات توفر استدعاءات النظام الثلاثة \fBsplice\fP() و \fBvmsplice\fP(2) و \fBtee\fP(2) لبرامج مساحة المستخدم تحكمًا كاملاً في مخزن مؤقت عشوائي للنواة، يُنفذ داخل النواة باستخدام نفس نوع المخزن المؤقت المستخدم للأنبوب. بشكل عام، تؤدي استدعاءات النظام هذه المهام التالية: .TP \fBsplice\fP() تنقل البيانات من المخزن المؤقت إلى واصف ملف عشوائي، أو العكس، أو من مخزن مؤقت إلى آخر. .TP \fBtee\fP(2) "تنسخ" البيانات من مخزن مؤقت إلى آخر. .TP \fBvmsplice\fP(2) "تنسخ" البيانات من مساحة المستخدم إلى المخزن المؤقت. .P .\" .\" Linus: Now, imagine using the above in a media server, for example. .\" Let's say that a year or two has passed, so that the video drivers .\" have been updated to be able to do the splice thing, and what can .\" you do? You can: .\" .\" - splice from the (mpeg or whatever - let's just assume that the video .\" input is either digital or does the encoding on its own - like they .\" pretty much all do) video input into a pipe (remember: no copies - the .\" video input will just DMA directly into memory, and splice will just .\" set up the pages in the pipe buffer) .\" - tee that pipe to split it up .\" - splice one end to a file (ie "save the compressed stream to disk") .\" - splice the other end to a real-time video decoder window for your .\" real-time viewing pleasure. .\" .\" Linus: Now, the advantage of splice()/tee() is that you can .\" do zero-copy movement of data, and unlike sendfile() you can .\" do it on _arbitrary_ data (and, as shown by "tee()", it's more .\" than just sending the data to somebody else: you can duplicate .\" the data and choose to forward it to two or more different .\" users - for things like logging etc.). .\" على الرغم من أننا نتحدث عن النسخ، إلا أن النسخ الفعلية تُتجنب عمومًا. تفعل النواة ذلك بتنفيذ مخزن أنبوب مؤقت كمجموعة من المؤشرات ذات العد المرجعي لصفحات ذاكرة النواة. تنشئ النواة "نسخًا" من الصفحات في مخزن مؤقت بإنشاء مؤشرات جديدة (للمخزن المؤقت الناتج) تشير إلى الصفحات، وزيادة أعداد المراجع للصفحات: تُنسخ المؤشرات فقط، وليس صفحات المخزن المؤقت. .P يجب تعريف \fB_FILE_OFFSET_BITS\fP ليكون 64 في الكود الذي يستخدم \fIoff_in\fP أو \fIoff_out\fP غير فارغ أو الذي يأخذ عنوان \fBsplice\fP، إذا كان الكود مخصصًا ليكون محمولاً إلى منصات x86 و ARM التقليدية 32 بت حيث يكون عرض \fBoff_t\fP مبدئيًا 32 بت. .SH أمثلة انظر \fBtee\fP(2) لمثال آخر. .P .\" SRC BEGIN (splice.c) .EX \& #define _GNU_SOURCE #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include \& int main(void) { int fd; int pfd[2]; off_t off; [[gnu::nonstring]] const char s[12] = "Hello, world"; \& fd = open("out", O_WRONLY | O_CREAT | O_EXCL, 0666); if (fd == \-1) err(EXIT_FAILURE, "open"); \& if (pipe(pfd) == \-1) err(EXIT_FAILURE, "pipe"); \& if (write(pfd[1], s, sizeof(s)) != sizeof(s)) err(EXIT_FAILURE, "write"); if (close(pfd[1]) == \-1) err(EXIT_FAILURE, "close"); \& off = 10; if (splice(pfd[0], NULL, fd, &off, sizeof(s), 0) != sizeof(s)) err(EXIT_FAILURE, "splice"); if (close(pfd[0]) == \-1) err(EXIT_FAILURE, "close"); \& printf("New offset is %jd\[rs]n", (intmax_t) off); \& if (close(fd) == \-1) err(EXIT_FAILURE, "close"); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBcopy_file_range\fP(2), \fBsendfile\fP(2), \fBtee\fP(2), \fBvmsplice\fP(2), \fBpipe\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 .