التابع 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على نهاية الملف.