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

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

يقرأ التابع read_nonblock على الأكثر maxlen (انظر فقرة البنية العامة) بايتًا من مجرى د/خ ios باستخدام استدعاء النظام read(2)‎ بعد تعيين O_NONBLOCK في واصف الملف (file descriptor) الأساسي.

في حال إعطاء الوسيط الاختياري outbuf، فينبغي أن يشير إلى سلسلة نصية String، والتي ستتلقى البيانات. لن يحتوي الوسيط outbuf إلا البيانات المستلمة بعد استدعاء التابع، حتى لو لم يكن فارغاً في البداية.

يستدعي التابع #read_nonblock استدعاء النظام read(2)‎. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام read (2): Errno :: EWOULDBLOCK، Errno :: EINTR، إلخ. يجب على المُستدعي التعامل مع هذه الأخطاء.

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

يطلق التابع #read_nonblock الخطأ EOFError عندما يصل إلى محرف نهايةالملف (EOF).

إن كان المخزن المؤقت (buffer) المخصص للقراءة البايت غير فارغ، فسيقرأ التابع #read_nonblock من المخزن المؤقت كما يفعل التابع readpartial. في هذه الحالة، لا يتم إجراء استدعاء النظام read(2)‎.

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


على الرغم من أن التابع #read_nonblock لا يُطلق الاستثتاء IO::WaitWritable. فيمكن للتابع OpenSSL::Buffering#read_nonblock يمكنه إطلاق IO::WaitWritable. إن كان من الضروري استخدام مجرى د/خ IO و SSL بطريقة متعددة الأشكال (polymorphically)، فيجب أن يعالَج IO::WaitWritable أيضا. راجع توثيق OpenSSL :: Buffering # read_nonblock للحصول على أمثلة.

لاحظ أن هذا التابع مماثل للتابع readpartial، باستثناء أن الراية non-blocking مٌعيّنة.

عبر إعطاء الوسيط المسمى (keyword argumen)‏ exception (انظر فقرة البنية العامة) القيمة false، يمكنك جعل التابع #read_nonblock لا يطلق استثناء IO::WaitReadable، بل يُعيد الرمز :wait_readable بدلاً من ذلك. عند محرف نهاية الملف (EOF،) سيعيد التابع read_nonblock القيمة nil بدلاً من إطلاق EOFError.

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

read_nonblock(maxlen [, options])   string
read_nonblock(maxlen, outbuf [, options]) outbuf

المعاملات

maxlen‎

الحد الأقصى

options‎

خيارات

outbuf‎

سلسلة نصية تتلقى البيانات

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

أمثلة

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

# emulates blocking read (readpartial).
begin
  result = io.read_nonblock(maxlen)
rescue IO::WaitReadable
  IO.select([io])
  retry
end

انظر أيضا

  • التابع read: يقرأ length بايتًا (انظر فقرة البنية العامة) من مجرى د/خ.
  • التابع readbyte: يقرأ البايت كما يفعل التابع IO#getbyte، إلا أنه يُطلق الاستثناء EOFError على نهاية الملف.

مصادر