.\" -*- coding: UTF-8 -*- .\" Copyright 1993, Thomas Koenig .\" Copyright 2007-2010, 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 readv 2 "22 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم readv, writev, preadv, pwritev, preadv2, pwritev2 \- قراءة أو كتابة بيانات في مخازن متعددة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBssize_t readv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP \fBssize_t writev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB);\fP .P \fBssize_t preadv(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB);\fP \fBssize_t pwritev(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB);\fP .P \fBssize_t preadv2(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB, int \fP\fIflags\fP\fB);\fP \fBssize_t pwritev2(int \fP\fIfd\fP\fB, const struct iovec *\fP\fIiov\fP\fB, int \fP\fIiovcnt\fP\fB,\fP \fB off_t \fP\fIoffset\fP\fB, int \fP\fIflags\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBpreadv\fP(), \fBpwritev\fP(): .nf منذ glibc 2.19: _DEFAULT_SOURCE glibc 2.19 وما قبله: _BSD_SOURCE .fi .SH الوصف استدعاء النظام \fBreadv\fP() يقرأ \fIiovcnt\fP مخزنا من الملف المرتبط بوصف الملف \fIfd\fP إلى المخازن الموصوفة بواسطة \fIiov\fP ("إدخال مبعثر"). .P استدعاء النظام \fBwritev\fP() يكتب \fIiovcnt\fP مخزنا من البيانات الموصوفة بواسطة \fIiov\fP إلى الملف المرتبط بوصف الملف \fIfd\fP ("إخراج مجمع"). .P المؤشر \fIiov\fP يشير إلى مصفوفة من بنى \fIiovec\fP، الموصوفة في \fBiovec\fP(3type). .P استدعاء النظام \fBreadv\fP() يعمل تماما مثل \fBread\fP(2) باستثناء أن مخازن متعددة تُملأ. .P استدعاء النظام \fBwritev\fP() يعمل تماما مثل \fBwrite\fP(2) باستثناء أن مخازن متعددة تُكتب. .P تُعالج المخازن بترتيب المصفوفة. هذا يعني أن \fBreadv\fP() يملأ \fIiov[0]\fP بالكامل قبل الانتقال إلى \fIiov[1]\fP، وهكذا. (إذا كانت البيانات غير كافية، فقد لا تُملأ جميع المخازن المشار إليها بواسطة \fIiov\fP.) وبالمثل، \fBwritev\fP() يكتب المحتوى الكامل لـ \fIiov[0]\fP قبل الانتقال إلى \fIiov[1]\fP، وهكذا. .P .\" Regarding atomicity, see https://bugzilla.kernel.org/show_bug.cgi?id=10596 نقل البيانات الذي ينفذه \fBreadv\fP() و \fBwritev\fP() هو ذري: البيانات التي يكتبها \fBwritev\fP() تُكتب ككتلة واحدة لا تختلط بمخرجات من عمليات كتابة في عمليات أخرى؛ وبالمثل، \fBreadv\fP() مضمون لقراءة كتلة متجاورة من البيانات من الملف، بغض النظر عن عمليات القراءة المنفذة في خيوط أو عمليات أخرى لها واصفات ملفات تشير إلى نفس وصف الملف المفتوح (انظر \fBopen\fP(2)). .SS "preadv() و pwritev()" استدعاء النظام \fBpreadv\fP() يجمع وظائف \fBreadv\fP() و \fBpread\fP(2). ينفذ نفس مهمة \fBreadv\fP()، لكنه يضيف وسيطة رابعة، \fIoffset\fP، التي تحدد إزاحة الملف التي ستنفذ عندها عملية الإدخال. .P استدعاء النظام \fBpwritev\fP() يجمع وظائف \fBwritev\fP() و \fBpwrite\fP(2). ينفذ نفس مهمة \fBwritev\fP()، لكنه يضيف وسيطة رابعة، \fIoffset\fP، التي تحدد إزاحة الملف التي ستنفذ عندها عملية الإخراج. .P إزاحة الملف لا تتغير بواسطة استدعاءات النظام هذه. الملف المشار إليه بواسطة \fIfd\fP يجب أن يكون قادرا على البحث. .SS "preadv2() و pwritev2()" استدعاءات النظام هذه مشابهة لاستدعاءات \fBpreadv\fP() و \fBpwritev\fP()، لكنها تضيف وسيطة خامسة، \fIflags\fP، التي تعدل السلوك على أساس كل استدعاء. .P على عكس \fBpreadv\fP() و \fBpwritev\fP()، إذا كانت وسيطة \fIoffset\fP هي \-1، فإن إزاحة الملف الحالية تُستخدم وتُحدث. .P وسيطة \fIflags\fP تحتوي على OR بتوي لصفر أو أكثر من الأعلام التالية: .TP \fBRWF_DSYNC\fP (منذ Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 يوفر مكافئا لكل كتابة لعلم \fBO_DSYNC\fP في \fBopen\fP(2). هذا العلم ذو معنى فقط لـ \fBpwritev2\fP()، وتأثيره ينطبق فقط على نطاق البيانات الذي يكتبه استدعاء النظام. .TP \fBRWF_HIPRI\fP (منذ Linux 4.6) قراءة/كتابة ذات أولوية عالية. يسمح لأنظمة الملفات القائمة على الكتل باستخدام استقصاء الجهاز، مما يوفر زمن وصول أقل، لكنه قد يستخدم موارد إضافية. (حاليا، هذه الميزة قابلة للاستخدام فقط على واصف ملف مفتوح باستخدام علم \fBO_DIRECT\fP.) .TP \fBRWF_SYNC\fP (منذ Linux 4.7) .\" commit e864f39569f4092c2b2bc72c773b6e486c7e3bd9 يوفر مكافئا لكل كتابة لعلم \fBO_SYNC\fP في \fBopen\fP(2). هذا العلم ذو معنى فقط لـ \fBpwritev2\fP()، وتأثيره ينطبق فقط على نطاق البيانات الذي يكتبه استدعاء النظام. .TP \fBRWF_NOWAIT\fP (منذ لينكس 4.14) .\" commit 3239d834847627b6634a4139cf1dc58f6f137a46 .\" commit 91f9943e1c7b6638f27312d03fe71fcc67b23571 لا تنتظر البيانات غير المتاحة فورا. إذا تم تحديد هذا العلم، فإن استدعاء النظام \fBpreadv2\fP() سيعود فورا إذا كان سيضطر لقراءة بيانات من التخزين الخلفي أو انتظار قفل. إذا تمت قراءة بعض البيانات بنجاح، فسيعيد عدد البايتات المقروءة. إذا لم تُقرأ أي بايتات، فسيعيد \-1 ويضبط \fIerrno\fP على \fBEAGAIN\fP (لكن انظر \fBBUGS\fP). حاليا، هذا العلم ذو معنى فقط لـ \fBpreadv2\fP(). .TP \fBRWF_APPEND\fP (منذ لينكس 4.16) .\" commit e1fc742e14e01d84d9693c4aca4ab23da65811fb يوفر مكافئا لكل كتابة لعلم \fBO_APPEND\fP في \fBopen\fP(2). هذا العلم ذو معنى فقط لـ \fBpwritev2\fP()، وتأثيره ينطبق فقط على نطاق البيانات الذي يكتبه استدعاء النظام. وسيطة \fIoffset\fP لا تؤثر على عملية الكتابة؛ البيانات تُلحق دائما بنهاية الملف. مع ذلك، إذا كانت وسيطة \fIoffset\fP هي \-1، فإن إزاحة الملف الحالية تُحدث. .TP \fBRWF_NOAPPEND\fP (منذ لينكس 6.9) لا تلتزم بعلم \fBO_APPEND\fP في \fBopen\fP(2). هذا العلم ذو معنى فقط لـ \fBpwritev2\fP(). تاريخيا، التزم Linux بعلم \fBO_APPEND\fP إذا تم ضبطه وتجاهل وسيطة الإزاحة، وهو خطأ. بالنسبة لـ \fBpwritev2\fP()، وسيطة \fIoffset\fP تُلتزم بها كما هو متوقع إذا تم ضبط علم \fBRWF_NOAPPEND\fP، تماما كما لو أن علم \fBO_APPEND\fP لم يُضبط. .TP \fBRWF_ATOMIC\fP (منذ لينكس 6.11) يتطلب أن تُصدر عمليات الكتابة إلى الملفات العادية في أنظمة الملفات القائمة على الكتل مع حماية ضد الكتابة الممزقة. تعني حماية الكتابة الممزقة أنه في حالة انقطاع التيار الكهربائي أو أي عطل آخر في الأجهزة، سيتم تخزين جميع البيانات من عملية الكتابة أو لا شيء منها، ولكن لا يتم أبدًا خلط البيانات القديمة والجديدة. هذه العلامة ذات معنى فقط لـ \fBpwritev2\fP()، وتأثيرها ينطبق فقط على نطاق البيانات الذي كتبته استدعاء النظام. يجب أن يكون إجمالي طول الكتابة قوة للعدد 2 وأن يكون بحجم في النطاق [\fIstx_atomic_write_unit_min\fP, \fIstx_atomic_write_unit_max\fP]. يجب أن تكون الكتابة عند إزاحة محاذاة طبيعيًا داخل الملف بالنسبة لإجمالي طول الكتابة. على سبيل المثال، يُسمح بكتابة بطول 32KiB عند إزاحة ملف 32KiB، ومع ذلك لا يُسمح بكتابة بطول 32KiB عند إزاحة ملف 48KiB. الحد الأعلى لـ \fIiovcnt\fP لـ \fBpwritev2\fP() يُعطى بالقيمة في \fIstx_atomic_write_segments_max.\fP تعمل حماية الكتابة الممزقة فقط مع علامة \fBO_DIRECT\fP، أي أن عمليات الكتابة المخزنة غير مدعومة. لضمان الاتساق من الكتابة بين حالة الملف في الذاكرة الأساسية وجهاز التخزين، يجب تحديد \fBO_SYNC\fP أو \fBO_DSYNC\fP لـ \fBopen\fP(2). يتم توفير نفس ضمانات الإدخال/الإخراج المتزامنة كما هو موصوف في \fBopen\fP(2) عند استخدام هذه العلامات أو علاماتها المكافئة واستدعاءات النظام (على سبيل المثال، إذا تم تحديد \fBRWF_SYNC\fP لـ \fBpwritev2\fP()). .TP \fBRWF_DONTCACHE\fP (منذ لينكس 6.14) ستقوم عمليات القراءة أو الكتابة إلى ملف عادي بتقليم محتوى خبيئة الصفحات المنشأة عند اكتمال العملية. هذا يختلف عن الإدخال/الإخراج المخزن العادي، حيث تبقى البيانات عادةً في الخبيئة حتى وقت استعادتها بسبب ضغط الذاكرة. إذا كانت نطاقات الإدخال/الإخراج المقروءة أو المكتوبة موجودة بالفعل في الخبيئة قبل هذه القراءة أو الكتابة، فلن يتم تقليم تلك النطاقات عند وقت اكتمال الإدخال/الإخراج. .IP بالإضافة إلى ذلك، سيتم بدء أي نطاق تم توسيخه بواسطة عملية كتابة مع تعيين \fBRWF_DONTCACHE\fP للكتابة الخلفية. هذا مشابه لاستدعاء \fBsync_file_range\fP(2) مع \fISYNC_FILE_RANGE_WRITE\fP لبدء الكتابة الخلفية على النطاق المحدد. \fBRWF_DONTCACHE\fP هو تلميح، أو أفضل جهد، حيث لا يتم تقديم ضمانات صارمة على حالة خبيئة الصفحات بمجرد اكتمال العملية. .IP إذا تم استخدامه على نظام ملفات أو جهاز كتلة لا يدعمه، فسيعيد \-1، وسيتم تعيين \fIerrno\fP إلى \fBEOPNOTSUPP\fP. .SH "قيمة الإرجاع" عند النجاح، تعيد \fBreadv\fP() و \fBpreadv\fP() و \fBpreadv2\fP() عدد البايتات المقروءة؛ تعيد \fBwritev\fP() و \fBpwritev\fP() و \fBpwritev2\fP() عدد البايتات المكتوبة. .P لاحظ أنه ليس خطأً إذا قامت مكالمة ناجحة بنقل بايتات أقل مما هو مطلوب (راجع \fBread\fP(2) و \fBwrite\fP(2)). .P عند الخطأ، تُعاد القيمة \-1، ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء الأخطاء هي كما هو معطى لـ \fBread\fP(2) و \fBwrite\fP(2). علاوة على ذلك، يمكن أن تفشل \fBpreadv\fP() و \fBpreadv2\fP() و \fBpwritev\fP() و \fBpwritev2\fP() أيضًا لنفس أسباب \fBlseek\fP(2). بالإضافة إلى ذلك، يتم تعريف الأخطاء التالية: .TP \fBEINVAL\fP مجموع قيم \fIiov_len\fP يفيض قيمة \fIssize_t\fP. .TP \fBEINVAL\fP إذا تم تحديد \fBRWF_ATOMIC\fP، فإن مجموعة مجموع قيم \fIiov_len\fP وقيمة \fIoffset\fP لا تتوافق مع قواعد حماية الكتابة الممزقة للطول والإزاحة. .TP \fBEINVAL\fP عدد المتجهات، \fIiovcnt\fP، أقل من الصفر أو أكبر من الحد الأقصى المسموح به. إذا تم تحديد \fBRWF_ATOMIC\fP، فإن هذا الحد الأقصى يُعطى بقيمة \fIstx_atomic_write_segments_max\fP من \fIstatx.\fP .TP \fBEOPNOTSUPP\fP تم تعيين \fBRWF_DONTCACHE\fP في \fIflags\fP والملف لا يدعمه. .TP \fBEOPNOTSUPP\fP تم تحديد علامة غير معروفة في \fIflags\fP. .SH الإصدارات .SS "الاختلافات بين مكتبة C والنواة" استدعاءات النظام الخام \fBpreadv\fP() و \fBpwritev\fP() لها تواقيع استدعاء تختلف قليلاً عن تلك الخاصة بوظائف الغلاف لمكتبة سي لجنو الموضحة في الملخص. الوسيطة الأخيرة، \fIoffset\fP، يتم فكها بواسطة وظائف الغلاف إلى وسيطتين في استدعاءات النظام: .P \fB unsigned long \fP\fIpos_l\fP\fB, unsigned long \fP\fIpos\fP .P تحتوي هذه الوسيطات، على التوالي، على البتات 32 ذات الترتيب المنخفض والبتات 32 ذات الترتيب العالي من \fIoffset\fP. .SH المعايير .TP \fBreadv\fP() .TQ \fBwritev\fP() POSIX.1\-2024. .TP \fBpreadv\fP() .TQ \fBpwritev\fP() BSD. .TP \fBpreadv2\fP() .TQ \fBpwritev2\fP() لينكس. .SH التاريخ .TP \fBreadv\fP() .TQ \fBwritev\fP() .\" Linux libc5 used .\" .I size_t .\" as the type of the .\" .I iovcnt .\" argument, .\" and .\" .I int .\" as the return type. .\" The readv/writev system calls were buggy before Linux 1.3.40. .\" (Says release.libc.) POSIX.1\-2001،‏ 4.4BSD (ظهر أولاً في 4.2BSD). .TP \fBpreadv\fP() .TQ \fBpwritev\fP() لينكس 2.6.30، glibc 2.10. .TP \fBpreadv2\fP() .TQ \fBpwritev2\fP() لينكس 4.6، glibc 2.26. .SS "الاختلافات التاريخية بين مكتبة سي والنواة" للتعامل مع حقيقة أن \fBIOV_MAX\fP كان منخفضًا جدًا في الإصدارات المبكرة من لينكس، قامت وظائف الغلاف لـ glibc لـ \fBreadv\fP() و \fBwritev\fP() ببعض العمل الإضافي إذا اكتشفت أن استدعاء النظام الأساسي فشل بسبب تجاوز هذا الحد. في حالة \fBreadv\fP()، قامت وظيفة الغلاف بتخصيص مخزن مؤقت مؤقت كبير بما يكفي لجميع العناصر المحددة بواسطة \fIiov\fP، ومررت هذا المخزن في استدعاء لـ \fBread\fP(2)، ونسخت البيانات من المخزن إلى المواقع المحددة بواسطة حقول \fIiov_base\fP لعناصر \fIiov\fP، ثم حررت المخزن. قامت وظيفة الغلاف لـ \fBwritev\fP() بتنفيذ المهمة المماثلة باستخدام مخزن مؤقت مؤقت واستدعاء لـ \fBwrite\fP(2). .P اختفت الحاجة إلى هذا الجهد الإضافي في وظائف الغلاف لـ glibc مع لينكس 2.2 والإصدارات الأحدث. ومع ذلك، استمرت glibc في توفير هذا السلوك حتى glibc 2.10. بدءًا من glibc 2.9، توفر وظائف الغلاف هذا السلوك فقط إذا اكتشفت المكتبة أن النظام يعمل بنواة لينكس أقدم من لينكس 2.6.18 (إصدار نواة تم اختياره بشكل تعسفي). ومنذ glibc 2.20 (التي تتطلب حدًا أدنى من لينكس 2.6.32)، تقوم وظائف الغلاف لـ glibc دائمًا باستدعاء استدعاءات النظام مباشرة. .SH ملاحظات .\" .\" يسمح POSIX.1 للتنفيذ بوضع حد على عدد العناصر التي يمكن تمريرها في \fIiov\fP. يمكن للتنفيذ الإعلان عن حده عن طريق تعريف \fBIOV_MAX\fP في \fI\fP أو في وقت التشغيل عبر القيمة المعادة من \fIsysconf(_SC_IOV_MAX)\fP. في أنظمة لينكس الحديثة، الحد هو 1024. في أيام لينكس 2.0، كان هذا الحد 16. .SH العلل .\" See .\" .\" The bug was introduced in .\" efa8480a831 fs: RWF_NOWAIT should imply IOCB_NOIO .\"and fixed in .\" 06c0444290 mm/filemap.c: generic_file_buffered_read() now uses find_get_pages_contig لينكس 5.9 ولينكس 5.10 بهما خطأ حيث قد تعيد \fBpreadv2\fP() مع علامة \fBRWF_NOWAIT\fP القيمة 0 حتى عندما لا تكون في نهاية الملف. .SH أمثلة يوضح نموذج الكود التالي استخدام \fBwritev\fP(): .P .in +4n .EX char *str0 = "hello "; char *str1 = "world\[rs]n"; ssize_t nwritten; struct iovec iov[2]; \& iov[0].iov_base = str0; iov[0].iov_len = strlen(str0); iov[1].iov_base = str1; iov[1].iov_len = strlen(str1); \& nwritten = writev(STDOUT_FILENO, iov, 2); .EE .in .SH "انظر أيضًا" \fBpread\fP(2)، \fBread\fP(2)، \fBwrite\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 .