التابع IO.write_nonblock‎ في روبي

من موسوعة حسوب
< Ruby‏ | IO
مراجعة 21:43، 13 نوفمبر 2018 بواسطة محمد-بغات (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>IO.write_nonblock‎</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Method تصنيف...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)
اذهب إلى التنقل اذهب إلى البحث

يكتب التابع write_nonblock السلسلة النصية المعطاة في ios باستخدام استدعاء النظام write(2)‎ بعد تعيين O_NONBLOCK لواصف الملف (file descriptor) الأساسي.

التابع write_nonblock سيعيد عدد البايتات المكتوبة.

يستدعي التابع #write_nonblock استدعاء النظام write(2)‎. ويتسبب في كافة الأخطاء التي يتسبب فيها استدعاء النظام write(2)‎ ‏: Errno :: EWOULDBLOCK، Errno :: EINTR، إلخ. قد تكون النتيجة أيضاً أصغر من طول السلسلة النصية (string.length) (أي أن الكتابة جزئية). يجب أن يعالج المستدعي هذه الأخطاء، وكذلك مسألة الكتابة الجزئية.

إن كان الاستثناء هو Errno :: EWOULDBLOCK أو Errno :: EAGAIN، فسيتم توسيعه بواسطة IO::WaitWritable. حتى يمكن استخدام IO::WaitWritable لمعالجة الاستثناءات لأجل إعادة استدعاء التابع write_nonblock.


إذا لم يكن المخزن المؤقت (buffer) للكتابة فارغًا، فسيتم إرساله (flushed) في البداية.

عندما يطلق التابع #write_nonblock استثناءً من النوع IO::WaitWritable، لا يجب استدعاء #write_nonblock حتى يكون مجرى د/خ قابلاً للكتابة لتجنب الحلقات التكرارية. ويمكن القيام بذلك على النحو التالي.


لاحظ أن هذا لا يضمن كتابة جميع البيانات في السلسلة النصية. سيتم الإبلاغ عن الطول المكتوب في النتيجة، ويجب فحصه في وقت لاحقًا.

في بعض أنظمة التشغيل مثل ويندوز، قد لا يكون التابع #write_nonblock مدعوما مع بعض أنواع مجاري د/خ IO. في مثل هذه الحالات، سيُطلق #write_nonblock الاستثناء Errno::EBADF.

عبر إعطاء الوسيط المسمى (keyword argument)‏ exception (انظر فقرة البنية العامة) القيمة false، يمكنك جعل التابع #write_nonblock لا يطلق استثناء IO::WaitWritable، بل يُعيد الرمز :wait_writable بدلاً من ذلك.

البنية العامة

write_nonblock(string) integer
write_nonblock(string [, options]) integer

المعاملات

string‎

سلسلة نصية

options‎

خيارات

القيمة المُعادة

أمثلة

مثال على استخدام التابع write_nonblock‎:

# Creates a pipe.
r, w = IO.pipe
# write_nonblock writes only 65536 bytes and return 65536.
# (The pipe size is 65536 bytes on this environment.)
s = "a" * 100000
p w.write_nonblock(s)     #=> 65536
# write_nonblock cannot write a byte and raise EWOULDBLOCK (EAGAIN).
p w.write_nonblock("b")   # Resource temporarily unavailable (Errno::EAGAIN)‎

انظر أيضا

  • التابع write: يكتب السلاسل النصية المعطاة في مجرى د/خ ios. يجب أن يكون المجرى مفتوحا في وضعية للكتابة. سيتم تحويل الوسائط غير النصية إلى سلسلة نصية باستخدام to_s. يُعيد عدد البايتات المكتوبة في الإجمال.

مصادر