الفرق بين المراجعتين ل"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> عددًا محدَّدًا من البايتات من [[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>read_nonblock</code> استدعاء النظام <code>read(2)‎</code>. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام <code>read(2)‎</code>، مثل <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code> وغيرهما . لذا، يجب على المُستدعي التعامل مع هذه الأخطاء.
  
يستدعي التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> استدعاء النظام read(2)‎. كما أنه يتسبب في كل الأخطاء التي يسببها استدعاء النظام read (2): Errno :: EWOULDBLOCK، Errno :: EINTR، إلخ. يجب على المُستدعي التعامل مع هذه الأخطاء.
+
إن كان الاستثناء هو أحد الاستثنائين <code>Errno::EWOULDBLOCK</code> أو <code>Errno::EAGAIN</code>، فسيتم توسيعه بواسطة التابع <code>[[Ruby/WaitReadable|WaitReadable]]</code>، حتى يمكن استخدامه  لمعالجة الاستثناءات لأجل إعادة استدعاء التابع <code>read_nonblock</code>.
  
إن كان الاستثناء هو Errno :: EWOULDBLOCK أو Errno :: EAGAIN، فسيتم توسيعه بواسطة <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>. حتى يمكن استخدام <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code> لمعالجة الاستثناءات لإعادة استدعاء التابع <code>read_nonblock</code>.
+
يطلق التابع <code>read_nonblock</code> الخطأ <code>[[Ruby/EOFError|EOFError]]</code> عندما يصل إلى محرف نهاية الملف (<code>EOF</code>).
  
يطلق التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> الخطأ <code>[[Ruby/EOFError|EOFError]]</code> عندما يصل إلى محرف نهايةالملف (EOF).
+
إن كان المخزن المؤقت لقراءة البايت (read byte buffer) غير فارغ، فسيقرأ التابع <code>read_nonblock</code> من المخزن المؤقت كما يفعل التابع <code>[[Ruby/IO/readpartial|readpartial]]</code>. في هذه الحالة، لا يتم استدعاء دالة النظام <code>read(2)‎</code>.
  
إن كان المخزن المؤقت (buffer) المخصص للقراءة البايت غير فارغ، فسيقرأ التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> من المخزن المؤقت كما يفعل التابع readpartial. في هذه الحالة، لا يتم إجراء استدعاء النظام read(2).
+
عندما يطلق التابع <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> للاطلاع على مثلة بهذا الخصوص.
  
عندما يطلق التابع <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> استثناءً من النوع <code>[[Ruby/WaitReadable|IO::WaitReadable]]</code>، لا يجب استدعاء <code>[[Ruby/IO/read_nonblock|#read_nonblock]]</code> حتى يكون [[Ruby/IO|مجرى د/خ]] قابلاً للقراءة لتجنب الحلقات التكرارية. ويمكن القيام بذلك على النحو التالي.
+
لاحظ أنَّ هذا التابع مماثل للتابع [[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> بدلًا من ذلك.
 
 
على الرغم من أن التابع <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 للحصول على أمثلة.
 
 
 
لاحظ أن هذا التابع مماثل للتابع 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
سطر 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>outbuf‎</code>===
+
==القيمة المعادة==
سلسلة نصية تتلقى البيانات
+
تعاد السلسلة النصية المقروءة من المجرى المعطى والتي لا يتجاوز حجمها الحجم <code>maxlen‎</code>. عند محرف نهاية الملف (<code>EOF</code>،) ستُعَاد القيمة <code>nil</code> بدلًا من إطلاق الاستثناء <code>[[Ruby/EOFError|EOFError]]</code>.
==القيمة المُعادة==
+
 
==أمثلة==
+
==انظر أيضًا==
مثال على استخدام التابع <code>read_nonblock‎</code>:
+
*التابع [[Ruby/IO/read-i|<code>read</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه.
<syntaxhighlight lang="ruby"># emulates blocking read (readpartial).
+
*التابع [[Ruby/IO/readbyte|<code>readbyte</code>]]: يقرأ بايتًا واحدًا من المجرى الذي استدعي معه.
begin
+
*التابع [[Ruby/IO/readchar|<code>readchar</code>]]: يقرأ محرفًا واحدًا من [[Ruby/IO|المجرى]] الذي استدعي معه.
  result = io.read_nonblock(maxlen)
+
*التابع [[Ruby/IO/readline|<code>readline</code>]]: يقرأ سطرًا واحدًا من المجرى الذي استدعي معه.
rescue IO::WaitReadable
+
*التابع [[Ruby/IO/readlines-i|<code>readlines</code>]]: يقرأ كل الأسطر الموجودة في [[Ruby/IO|المجرى]] الذي استدعي معه ثم يعيدها في [[Ruby/Array|مصفوفة]]. 
  IO.select([io])
+
*التابع [[Ruby/IO/readpartial|<code>readpartial</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استدعي معه.
  retry
 
end‎</syntaxhighlight>
 
==انظر أيضا==
 
* التابع <code>[[Ruby/IO/read-i|read]]</code>: يقرأ <code>length</code> بايتًا (انظر فقرة البنية العامة) من [[Ruby/IO|مجرى د/خ]].
 
* التابع <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‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 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: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استدعي معه.

مصادر