الفرق بين المراجعتين لصفحة: «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>read_nonblock</code> عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استُدعي معه باستخدام استدعاء النظام <code>read(2)</code> بعد تعيين الراية <code>O_NONBLOCK</code> لواصف الملف (file descriptor) الأساسي. | ||
في | يستدعي التابع <code>read_nonblock</code> استدعاء النظام <code>read(2)</code>. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام <code>read(2)</code>، مثل <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code> وغيرهما . لذا، يجب على المُستدعي التعامل مع هذه الأخطاء. | ||
إن كان الاستثناء هو أحد الاستثنائين <code>Errno::EWOULDBLOCK</code> أو <code>Errno::EAGAIN</code>، فسيتم توسيعه بواسطة التابع <code>[[Ruby/WaitReadable|WaitReadable]]</code>، حتى يمكن استخدامه لمعالجة الاستثناءات لأجل إعادة استدعاء التابع <code>read_nonblock</code>. | |||
يطلق التابع <code>read_nonblock</code> الخطأ <code>[[Ruby/EOFError|EOFError]]</code> عندما يصل إلى محرف نهاية الملف (<code>EOF</code>). | |||
إن كان المخزن المؤقت لقراءة البايت (read byte buffer) غير فارغ، فسيقرأ التابع <code>read_nonblock</code> من المخزن المؤقت كما يفعل التابع <code>[[Ruby/IO/readpartial|readpartial]]</code>. في هذه الحالة، لا يتم استدعاء دالة النظام <code>read(2)</code>. | |||
عندما يطلق التابع <code>read_nonblock</code> استثناءً من النوع <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، فلا ينبغي استدعاء <code>read_nonblock</code> حتى يكون [[Ruby/IO|المجرى]] قابلًا للقراءة لتجنب الحلقات التكرارية. يمكن القيام بذلك على النحو التالي:<syntaxhighlight lang="ruby"># (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>]]، باستثناء أنَّ الراية <code>non-blocking</code> ستكون مٌعيّنة. | |||
عبر إعطاء الوسيط المسمى (keyword argumen) <code>exception</code> القيمة <code>false</code>، يمكنك منع التابع <code>read_nonblock</code> من إطلاق الاستثناء <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، وجعله يُعيد [[Ruby/Symbol|الرمز]] <code>:wait_readable</code> بدلًا من ذلك. | |||
عبر إعطاء الوسيط المسمى (keyword argumen) <code>exception</code> | |||
==البنية العامة== | ==البنية العامة== | ||
<syntaxhighlight lang="ruby">read_nonblock(maxlen [, options]) → string | <syntaxhighlight lang="ruby">read_nonblock(maxlen [, options]) → string | ||
سطر 29: | سطر 29: | ||
==المعاملات== | ==المعاملات== | ||
===<code>maxlen</code>=== | ===<code>maxlen</code>=== | ||
الحد الأقصى | [[Ruby/Integer|عدد صحيح]] يمثِّل الحد الأقصى للبايتات المراد قراءتها من المجرى المعطى. | ||
===<code>outbuf</code>=== | |||
في حال إعطاء هذا المعامل الاختياري، فينبغي أن يشير إلى [[Ruby/String|السلسلة النصية]] التي ستتلقى البيانات المقروءة من المجرى. لن يحتوي <code>outbuf</code> إلا على البيانات المستلمة بعد استدعاء التابع حتى لو لم يكن فارغًا في البداية (أي ستُمسَح البيانات القديمة المخزنة فيه مسبقًا). | |||
===<code>options</code>=== | ===<code>options</code>=== | ||
خيارات | خيارات تضبط عملية القراءة. | ||
===<code> | ==القيمة المعادة== | ||
تعاد السلسلة النصية المقروءة من المجرى المعطى والتي لا يتجاوز حجمها الحجم <code>maxlen</code>. عند محرف نهاية الملف (<code>EOF</code>،) ستُعَاد القيمة <code>nil</code> بدلًا من إطلاق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>. | |||
==انظر أيضًا== | |||
*التابع [[Ruby/IO/read-i|<code>read</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه. | |||
< | *التابع [[Ruby/IO/readbyte|<code>readbyte</code>]]: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه. | ||
*التابع [[Ruby/IO/readchar|<code>readchar</code>]]: يقرأ محرفًا واحدًا من [[Ruby/IO|المجرى]] الذي استدعي معه. | |||
*التابع [[Ruby/IO/readline|<code>readline</code>]]: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه. | |||
*التابع [[Ruby/IO/readlines-i|<code>readlines</code>]]: يقرأ كل الأسطر الموجودة في [[Ruby/IO|المجرى]] الذي استدعي معه ثم يعيدها في [[Ruby/Array|مصفوفة]]. | |||
*التابع [[Ruby/IO/readpartial|<code>readpartial</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه. | |||
==انظر | |||
* | |||
* | |||
==مصادر== | ==مصادر== | ||
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-read_nonblock قسم | *[http://ruby-doc.org/core-2.5.1/IO.html#method-i-read_nonblock قسم التابع read_nonblock في الصنف IO في توثيق روبي الرسمي.] |
المراجعة الحالية بتاريخ 08:37، 23 ديسمبر 2018
يقرأ التابع 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
: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.