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

من موسوعة حسوب
< Ruby‏ | IO

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

يستدعي التابع 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 حتى يكون المجرى قابلًا للقراءة لتجنب الحلقات التكرارية. يمكن القيام بذلك على النحو التالي:

# (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 بدلًا من ذلك.

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

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

المعاملات

maxlen‎

عدد صحيح يمثِّل الحد الأقصى للبايتات المراد قراءتها من المجرى المعطى.

outbuf‎

في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى السلسلة النصية التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي outbuf إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا).

options‎

خيارات تضبط عملية القراءة.

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

تعاد السلسلة النصية المقروءة من المجرى المعطى والتي لا يتجاوز حجمها الحجم maxlen‎. عند محرف نهاية الملف (EOF،) ستُعَاد القيمة nil بدلًا من إطلاق الاستثناء EOFError.

انظر أيضًا

  • التابع read: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.
  • التابع readbyte: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه.
  • التابع readchar: يقرأ محرفًا واحدًا من المجرى الذي استدعي معه.
  • التابع readline: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه.
  • التابع readlines: يقرأ كل الأسطر الموجودة في المجرى الذي استدعي معه ثم يعيدها في مصفوفة
  • التابع readpartial: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.

مصادر