الفرق بين المراجعتين لصفحة: «Ruby/IO/read nonblock»
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>IO.read_nonblock</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Method تصنيف:...' |
لا ملخص تعديل |
||
سطر 3: | سطر 3: | ||
[[تصنيف: Ruby Method]] | [[تصنيف: Ruby Method]] | ||
[[تصنيف: Ruby IO]] | [[تصنيف: Ruby IO]] | ||
يقرأ التابع <code>read_nonblock</code> على الأكثر <code>maxlen</code> (انظر فقرة البنية العامة) بايتًا من [[Ruby/IO|مجرى د/خ]] <code> | يقرأ التابع <code>read_nonblock</code> على الأكثر <code>maxlen</code> (انظر فقرة البنية العامة) بايتًا من [[Ruby/IO|مجرى د/خ]] الذي استُدعي معه باستخدام استدعاء النظام <code>read(2)</code> بعد تعيين الراية <code>O_NONBLOCK</code> لواصف الملف (file descriptor) الأساسي. | ||
في حال إعطاء الوسيط الاختياري <code>outbuf</code>، فينبغي أن يشير إلى [[Ruby/String|سلسلة نصية]] | في حال إعطاء الوسيط الاختياري <code>outbuf</code>، فينبغي أن يشير إلى [[Ruby/String|سلسلة نصية]]، والتي ستتلقى البيانات. لن يحتوي الوسيط <code>outbuf</code> إلا البيانات المستلمة بعد استدعاء التابع، حتى لو لم يكن فارغاً في البداية. | ||
يستدعي التابع <code> | يستدعي التابع <code>read_nonblock</code> استدعاء النظام <code>read(2)</code>. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام <code>read(2)</code>، مثل <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code> وغيرهما . لذا يجب على المُستدعي التعامل مع هذه الأخطاء. | ||
إن كان الاستثناء هو Errno :: EWOULDBLOCK أو | إن كان الاستثناء هو أحد الاستثنائين <code>Errno::EWOULDBLOCK</code> أو <code>Errno::EAGAIN</code>، فسيتم توسيعه بواسطة التابع <code>[[Ruby/WaitReadable|WaitReadable]]</code>، حتى يمكن استخدامه لمعالجة الاستثناءات لأجل إعادة استدعاء التابع <code>read_nonblock</code>. | ||
يطلق التابع <code> | يطلق التابع <code>read_nonblock</code> الخطأ <code>[[Ruby/EOFError|EOFError]]</code> عندما يصل إلى محرف نهايةالملف (<code>EOF</code>). | ||
إن كان المخزن المؤقت (buffer) | إن كان المخزن المؤقت لقراءة البايت (read byte buffer) غير فارغ، فسيقرأ التابع <code>read_nonblock</code> من المخزن المؤقت كما يفعل التابع <code>[[Ruby/IO/readpartial|readpartial]]</code>. في هذه الحالة، لا يتم إجراء استدعاء النظام <code>read(2)</code>. | ||
عندما يطلق التابع <code> | عندما يطلق التابع <code>read_nonblock</code> استثناءً من النوع <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، فلا ينبغي استدعاء <code>read_nonblock</code> حتى يكون [[Ruby/IO|مجرى د/خ]] قابلاً للقراءة، لتجنب الحلقات التكرارية. يمكن القيام بذلك على النحو التالي.<syntaxhighlight lang="ruby"># emulates blocking read (readpartial). | ||
begin | |||
result = io.read_nonblock(maxlen) | |||
rescue IO::WaitReadable | |||
IO.select([io]) | |||
retry | |||
end</syntaxhighlight>على الرغم من أن التابع <code>read_nonblock</code> لا يُطلق الاستثتاء <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>. فيمكن للتابع <code>OpenSSL::Buffering#read_nonblock</code> إطلاقه. إن كان من الضروري استخدام [[Ruby/IO|مجرى د/خ]] و بروتوكول SSL بطريقة متعددة الأشكال (polymorphically)، فمن الضروري إذن أن يعالَج <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>. راجع توثيق <code>OpenSSL::Buffering#read_nonblock</code> للحصول على أمثلة. | |||
لاحظ أن هذا التابع مماثل للتابع [[Ruby/IO/readpartial|<code>readpartial</code>]]، باستثناء أن الراية non-blocking ستكون مٌعيّنة. | |||
عبر إعطاء الوسيط المسمى (keyword argumen) <code>exception</code>القيمة <code>false</code>، يمكنك منع التابع <code>read_nonblock</code> من إطلاق الاستثناء <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، وجعله يُعيد [[Ruby/Symbol|الرمز]] <code>:wait_readable</code> بدلاً من ذلك. | |||
عند محرف نهاية الملف (<code>EOF</code>،) سيعيد التابع <code>read_nonblock</code> القيمة <code>nil</code> بدلاً من إطلاق <code>[[Ruby/EOFError|EOFError]]</code>. | |||
==البنية العامة== | ==البنية العامة== | ||
<syntaxhighlight lang="ruby">read_nonblock(maxlen [, options]) → string | <syntaxhighlight lang="ruby">read_nonblock(maxlen [, options]) → string | ||
سطر 35: | سطر 39: | ||
سلسلة نصية تتلقى البيانات | سلسلة نصية تتلقى البيانات | ||
==القيمة المُعادة== | ==القيمة المُعادة== | ||
يعيد التابع <code>read_nonblock</code> سلسلة نصية. | |||
==انظر أيضا== | ==انظر أيضا== | ||
* التابع <code>[[Ruby/IO/read-i|read]]</code>: يقرأ | *التابع <code>[[Ruby/IO/read-i|read]]</code>: يقرأ عددا من البايتات من [[Ruby/IO|مجرى د/خ]]. | ||
* التابع <code>[[Ruby/IO/readbyte|readbyte]]</code>: يقرأ البايت كما يفعل التابع <code>IO#getbyte</code>، إلا أنه يُطلق الاستثناء <code>EOFError</code> | *التابع <code>[[Ruby/IO/readbyte|readbyte]]</code>: يقرأ البايت كما يفعل التابع <code>IO#getbyte</code>، إلا أنه يُطلق الاستثناء <code>EOFError</code> عند نهاية الملف. | ||
==مصادر== | ==مصادر== | ||
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-read_nonblock قسم التابع read_nonblock في الصنف IO في توثيق روبي الرسمي.] | *[http://ruby-doc.org/core-2.5.1/IO.html#method-i-read_nonblock قسم التابع read_nonblock في الصنف IO في توثيق روبي الرسمي.] |
مراجعة 18:58، 13 نوفمبر 2018
يقرأ التابع 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
عند نهاية الملف.