التابع IO.read_nonblock
في روبي
يقرأ التابع 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
على نهاية الملف.