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

من موسوعة حسوب

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

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

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

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

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

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

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

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

على الرغم من أن التابع read_nonblock لا يُطلق الاستثتاء IO::WaitWritable. فيمكن للتابع OpenSSL::Buffering#read_nonblock إطلاقه. إن كان من الضروري استخدام مجرى د/خ و بروتوكول 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 سلسلة نصية.

انظر أيضا

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

مصادر