الفرق بين المراجعتين لصفحة: «Ruby/IO/read nonblock»

من موسوعة حسوب
< Ruby‏ | IO
أنشأ الصفحة ب'<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>ios</code> باستخدام استدعاء النظام read(2)‎ بعد تعيين O_NONBLOCK في واصف الملف (file descriptor) الأساسي.
يقرأ التابع <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>[[Ruby/String|String]]</code>، والتي ستتلقى البيانات. لن يحتوي الوسيط <code>outbuf</code> إلا البيانات المستلمة بعد استدعاء التابع، حتى لو لم يكن فارغاً في البداية.
في حال إعطاء الوسيط الاختياري <code>outbuf</code>، فينبغي أن يشير إلى [[Ruby/String|سلسلة نصية]]، والتي ستتلقى البيانات. لن يحتوي الوسيط <code>outbuf</code> إلا البيانات المستلمة بعد استدعاء التابع، حتى لو لم يكن فارغاً في البداية.


يستدعي التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> استدعاء النظام read(2)‎. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام read (2): Errno :: EWOULDBLOCK، Errno :: EINTR، إلخ. يجب على المُستدعي التعامل مع هذه الأخطاء.
يستدعي التابع <code>read_nonblock</code> استدعاء النظام <code>read(2)‎</code>. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام <code>read(2)‎</code>، مثل <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code> وغيرهما . لذا يجب على المُستدعي التعامل مع هذه الأخطاء.


إن كان الاستثناء هو Errno :: EWOULDBLOCK أو Errno :: EAGAIN، فسيتم توسيعه بواسطة <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>. حتى يمكن استخدام <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code> لمعالجة الاستثناءات لإعادة استدعاء التابع <code>read_nonblock</code>.
إن كان الاستثناء هو أحد الاستثنائين <code>Errno::EWOULDBLOCK</code> أو <code>Errno::EAGAIN</code>، فسيتم توسيعه بواسطة التابع <code>[[Ruby/WaitReadable|WaitReadable]]</code>، حتى يمكن استخدامه  لمعالجة الاستثناءات لأجل إعادة استدعاء التابع <code>read_nonblock</code>.


يطلق التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> الخطأ <code>[[Ruby/EOFError|EOFError]]</code> عندما يصل إلى محرف نهايةالملف (EOF).
يطلق التابع <code>read_nonblock</code> الخطأ <code>[[Ruby/EOFError|EOFError]]</code> عندما يصل إلى محرف نهايةالملف (<code>EOF</code>).


إن كان المخزن المؤقت (buffer) المخصص للقراءة البايت غير فارغ، فسيقرأ التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> من المخزن المؤقت كما يفعل التابع readpartial. في هذه الحالة، لا يتم إجراء استدعاء النظام read(2)‎.
إن كان المخزن المؤقت لقراءة البايت (read byte buffer) غير فارغ، فسيقرأ التابع <code>read_nonblock</code> من المخزن المؤقت كما يفعل التابع <code>[[Ruby/IO/readpartial|readpartial]]</code>. في هذه الحالة، لا يتم إجراء استدعاء النظام <code>read(2)‎</code>.


عندما يطلق التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> استثناءً من النوع <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، لا يجب استدعاء <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> حتى يكون [[Ruby/IO|مجرى د/خ]] قابلاً للقراءة لتجنب الحلقات التكرارية. ويمكن القيام بذلك على النحو التالي.
عندما يطلق التابع <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>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> لا يُطلق الاستثتاء <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>. فيمكن للتابع OpenSSL::Buffering#read_nonblock يمكنه إطلاق <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>. إن كان من الضروري استخدام [[Ruby/IO|مجرى د/خ]] <code>[[Ruby/IO|IO]]</code> و SSL بطريقة متعددة الأشكال (polymorphically)، فيجب أن يعالَج <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code> أيضا. راجع توثيق OpenSSL :: Buffering # read_nonblock للحصول على أمثلة.
عند محرف نهاية الملف (<code>EOF</code>،) سيعيد التابع <code>read_nonblock</code> القيمة <code>nil</code> بدلاً من إطلاق <code>[[Ruby/EOFError|EOFError]]</code>.
 
لاحظ أن هذا التابع مماثل للتابع readpartial، باستثناء أن الراية non-blocking مٌعيّنة.
 
عبر إعطاء الوسيط المسمى (keyword argumen)‏ <code>exception</code> (انظر فقرة البنية العامة) القيمة <code>false</code>، يمكنك جعل التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> لا يطلق استثناء <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، بل يُعيد [[Ruby/Symbol|الرمز]] <code>:wait_readable</code> بدلاً من ذلك. عند محرف نهاية الملف (EOF،) سيعيد التابع <code>read_nonblock</code> القيمة nil بدلاً من إطلاق <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>read_nonblock‎</code>:
 
<syntaxhighlight lang="ruby"># emulates blocking read (readpartial).
begin
  result = io.read_nonblock(maxlen)
rescue IO::WaitReadable
  IO.select([io])
  retry
end‎</syntaxhighlight>
==انظر أيضا==
==انظر أيضا==
* التابع <code>[[Ruby/IO/read-i|read]]</code>: يقرأ  <code>length</code> بايتًا (انظر فقرة البنية العامة) من [[Ruby/IO|مجرى د/خ]].
*التابع <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 عند نهاية الملف.

مصادر