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

من موسوعة حسوب
< Ruby‏ | IO
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>IO.write_nonblock‎</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Method تصنيف...'
 
ط تدقيق
 
(مراجعة متوسطة واحدة بواسطة مستخدم واحد آخر غير معروضة)
سطر 3: سطر 3:
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby IO]]
[[تصنيف: Ruby IO]]
يكتب التابع <code>write_nonblock</code> [[Ruby/String|السلسلة النصية]] المعطاة في <code>ios</code> باستخدام استدعاء النظام write(2)‎ بعد تعيين O_NONBLOCK لواصف الملف (file descriptor) الأساسي.
يكتب التابع <code>write_nonblock</code> [[Ruby/String|السلسلة النصية]] المُمرَّرة إليه في [[Ruby/IO|المجرى]] الذي استُدعي معه باستخدام استدعاء النظام <code>write(2)‎</code> بعد تعيين قيمة الراية <code>O_NONBLOCK</code> الخاصة بواصف الملف (file descriptor) الأساسي.


التابع <code>write_nonblock</code> سيعيد عدد البايتات المكتوبة.
يستدعي التابع <code>write_nonblock</code> استدعاء النظام <code>write(2)‎</code>. ويتسبب في كافة الأخطاء التي يتسبب فيها استدعاء النظام <code>write(2)‎</code>، مثل <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code> وغيرهما. قد تكون النتيجة أصغر من طول [[Ruby/String|السلسلة النصية]] (أي أن الكتابة جزئية). لذا يجب أن يعالج المستدعي هذه الأخطاء، إضافة إلى مسألة الكتابة الجزئية.


يستدعي التابع <code>[[Ruby/IO/write_nonblock|#write_nonblock]]</code> استدعاء النظام write(2)‎. ويتسبب في كافة الأخطاء التي يتسبب فيها استدعاء النظام write(2)‎ ‏: Errno :: EWOULDBLOCK، Errno :: EINTR، إلخ. قد تكون النتيجة أيضاً أصغر من طول [[Ruby/String|السلسلة النصية]] (string.length) (أي أن الكتابة جزئية). يجب أن يعالج المستدعي هذه الأخطاء، وكذلك مسألة الكتابة الجزئية.
إن كان الاستثناء يساوي <code>Errno::EWOULDBLOCK</code> أو <code>Errno::EAGAIN</code>، فسيتم توسيعه بواسطة <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code> حتى يمكن  استخدام <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code> لمعالجة الاستثناءات لأجل إعادة استدعاء التابع <code>write_nonblock</code>.


إن كان الاستثناء هو Errno :: EWOULDBLOCK أو Errno :: EAGAIN، فسيتم توسيعه بواسطة <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>. حتى يمكن استخدام <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code> لمعالجة الاستثناءات لأجل إعادة استدعاء التابع <code>write_nonblock</code>.
إذا لم يكن المخزن المؤقت (buffer) للكتابة فارغًا، فسيتم تفريغه (flushed) في البداية.


عندما يطلق التابع <code>write_nonblock</code> استثناءً من النوع <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>، فلا يجب استدعاؤه حتى يكون [[Ruby/IO|المجرى]] قابلًا للكتابة، لتجنب الحلقات التكرارية. ويمكن القيام بذلك على النحو التالي:<syntaxhighlight lang="ruby">begin
  result = io.write_nonblock(string)
rescue IO::WaitWritable, Errno::EINTR
  IO.select(nil, [io])
  retry
end</syntaxhighlight>لاحظ أنَّ هذا لا يضمن كتابة جميع البيانات في [[Ruby/String|السلسلة النصية]]. سيتم الإبلاغ عن الطول المكتوب في النتيجة، ويجب فحصه في وقت لاحقًا.


في بعض أنظمة التشغيل, مثل ويندوز، قد لا يكون التابع <code>write_nonblock</code> مدعومًا مع بعض أنواع [[Ruby/IO|المجاري]]. في مثل هذه الحالات، سيُطلق التابع<code>write_nonblock</code> الاستثناء <code>Errno::EBADF</code>.


إذا لم يكن المخزن المؤقت (buffer) للكتابة فارغًا، فسيتم إرساله (flushed) في البداية.
عبر إعطاء الوسيط المسمى (keyword argument)‏ <code>exception</code> القيمة <code>false</code>، يمكنك منع التابع <code>write_nonblock</code> من إطلاق الاستثناء <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>، وجعله يُعيد [[Ruby/Symbol|الرمز]] <code>:wait_writable</code> بدلًا من ذلك.
 
عندما يطلق التابع <code>[[Ruby/IO/write_nonblock|#write_nonblock]]</code> استثناءً من النوع <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>، لا يجب استدعاء <code>[[Ruby/IO/write_nonblock|#write_nonblock]]</code> حتى يكون [[Ruby/IO|مجرى د/خ]] قابلاً للكتابة لتجنب الحلقات التكرارية. ويمكن القيام بذلك على النحو التالي.
 
 
 
لاحظ أن هذا لا يضمن كتابة جميع البيانات في [[Ruby/String|السلسلة النصية]]. سيتم الإبلاغ عن الطول المكتوب في النتيجة، ويجب فحصه في وقت لاحقًا.
 
في بعض أنظمة التشغيل مثل ويندوز، قد لا يكون التابع <code>[[Ruby/IO/write_nonblock|#write_nonblock]]</code> مدعوما مع بعض أنواع [[Ruby/IO|مجاري د/خ]] <code>[[Ruby/IO|IO]]</code>. في مثل هذه الحالات، سيُطلق <code>[[Ruby/IO/write_nonblock|#write_nonblock]]</code> الاستثناء <code>Errno::EBADF</code>.
 
عبر إعطاء الوسيط المسمى (keyword argument)‏ <code>exception</code> (انظر فقرة البنية العامة) القيمة <code>false</code>، يمكنك جعل التابع <code>[[Ruby/IO/write_nonblock|#write_nonblock]]</code> لا يطلق استثناء <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>، بل يُعيد [[Ruby/Symbol|الرمز]] <code>:wait_writable</code> بدلاً من ذلك.
==البنية العامة==
==البنية العامة==
<syntaxhighlight lang="ruby">write_nonblock(string)→ integer
<syntaxhighlight lang="ruby">write_nonblock(string)→ integer
سطر 29: سطر 26:
==المعاملات==
==المعاملات==
===<code>string‎</code>===
===<code>string‎</code>===
[[Ruby/String|سلسلة نصية]]
[[Ruby/String|سلسلة نصية]] يراد كتابتها في المجرى.
===<code>options‎</code>===
===<code>options‎</code>===
خيارات
خيارات تضبط سلوك التابع.
==القيمة المُعادة==
==القيمة المعادة==
يعاد عدد صحيح يمثِّل عدد البايتات المكتوبة في المجرى.
 
==أمثلة==
==أمثلة==
مثال على استخدام التابع <code>write_nonblock‎</code>:
مثال على استخدام التابع <code>write_nonblock‎</code>:<syntaxhighlight lang="ruby"># Creates a pipe.
<syntaxhighlight lang="ruby"># Creates a pipe.
r, w = IO.pipe
r, w = IO.pipe
# write_nonblock writes only 65536 bytes and return 65536.
# write_nonblock writes only 65536 bytes and return 65536.
سطر 43: سطر 41:
# write_nonblock cannot write a byte and raise EWOULDBLOCK (EAGAIN).
# write_nonblock cannot write a byte and raise EWOULDBLOCK (EAGAIN).
p w.write_nonblock("b")  # Resource temporarily unavailable (Errno::EAGAIN)‎</syntaxhighlight>
p w.write_nonblock("b")  # Resource temporarily unavailable (Errno::EAGAIN)‎</syntaxhighlight>
==انظر أيضا==
==انظر أيضًا==
* التابع <code>[[Ruby/IO/write-i|write]]</code>: يكتب [[Ruby/String|السلاسل النصية]] المعطاة في [[Ruby/IO|مجرى د/خ]] <code>ios</code>. يجب أن يكون المجرى مفتوحا في وضعية للكتابة. سيتم تحويل الوسائط غير النصية إلى [[Ruby/String|سلسلة نصية]] باستخدام <code>to_s</code>. يُعيد  عدد البايتات المكتوبة في الإجمال.
*التابع [[Ruby/IO/read nonblock|<code>read_nonblock</code>]]: يقرأ عددًا محدَّدًا من البايتات من [[Ruby/IO|المجرى]] الذي استُدعي معه باستخدام استدعاء النظام <code>read(2)‎</code> بعد تعيين الراية <code>O_NONBLOCK</code> لواصف الملف (file descriptor) الأساسي.
 
*التابع <code>[[Ruby/IO/write-i|write]]</code>: يكتب [[Ruby/String|السلاسل النصية]] المُمرَّرة إليه في [[Ruby/IO|المجرى]] الذي استدعي معه. 
==مصادر==
==مصادر==
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-write_nonblock قسم التابع write_nonblock‎ في الصنف IO‎ في توثيق روبي الرسمي.]
*[http://ruby-doc.org/core-2.5.1/IO.html#method-i-write_nonblock قسم التابع write_nonblock‎ في الصنف IO‎ في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 12:28، 23 ديسمبر 2018

يكتب التابع write_nonblock السلسلة النصية المُمرَّرة إليه في المجرى الذي استُدعي معه باستخدام استدعاء النظام write(2)‎ بعد تعيين قيمة الراية O_NONBLOCK الخاصة بواصف الملف (file descriptor) الأساسي.

يستدعي التابع write_nonblock استدعاء النظام write(2)‎. ويتسبب في كافة الأخطاء التي يتسبب فيها استدعاء النظام write(2)‎، مثل Errno::EWOULDBLOCK و Errno::EINTR وغيرهما. قد تكون النتيجة أصغر من طول السلسلة النصية (أي أن الكتابة جزئية). لذا يجب أن يعالج المستدعي هذه الأخطاء، إضافة إلى مسألة الكتابة الجزئية.

إن كان الاستثناء يساوي Errno::EWOULDBLOCK أو Errno::EAGAIN، فسيتم توسيعه بواسطة IO::WaitWritable حتى يمكن استخدام IO::WaitWritable لمعالجة الاستثناءات لأجل إعادة استدعاء التابع write_nonblock.

إذا لم يكن المخزن المؤقت (buffer) للكتابة فارغًا، فسيتم تفريغه (flushed) في البداية.

عندما يطلق التابع write_nonblock استثناءً من النوع IO::WaitWritable، فلا يجب استدعاؤه حتى يكون المجرى قابلًا للكتابة، لتجنب الحلقات التكرارية. ويمكن القيام بذلك على النحو التالي:

begin
  result = io.write_nonblock(string)
rescue IO::WaitWritable, Errno::EINTR
  IO.select(nil, [io])
  retry
end

لاحظ أنَّ هذا لا يضمن كتابة جميع البيانات في السلسلة النصية. سيتم الإبلاغ عن الطول المكتوب في النتيجة، ويجب فحصه في وقت لاحقًا.

في بعض أنظمة التشغيل, مثل ويندوز، قد لا يكون التابع write_nonblock مدعومًا مع بعض أنواع المجاري. في مثل هذه الحالات، سيُطلق التابعwrite_nonblock الاستثناء Errno::EBADF.

عبر إعطاء الوسيط المسمى (keyword argument)‏ exception القيمة false، يمكنك منع التابع write_nonblock من إطلاق الاستثناء IO::WaitWritable، وجعله يُعيد الرمز:wait_writable بدلًا من ذلك.

البنية العامة

write_nonblock(string) integer
write_nonblock(string [, options]) integer

المعاملات

string‎

سلسلة نصية يراد كتابتها في المجرى.

options‎

خيارات تضبط سلوك التابع.

القيمة المعادة

يعاد عدد صحيح يمثِّل عدد البايتات المكتوبة في المجرى.

أمثلة

مثال على استخدام التابع write_nonblock‎:

# Creates a pipe.
r, w = IO.pipe
# write_nonblock writes only 65536 bytes and return 65536.
# (The pipe size is 65536 bytes on this environment.)
s = "a" * 100000
p w.write_nonblock(s)     #=> 65536
# write_nonblock cannot write a byte and raise EWOULDBLOCK (EAGAIN).
p w.write_nonblock("b")   # Resource temporarily unavailable (Errno::EAGAIN)‎

انظر أيضًا

  • التابع read_nonblock: يقرأ عددًا محدَّدًا من البايتات من المجرى الذي استُدعي معه باستخدام استدعاء النظام read(2)‎ بعد تعيين الراية O_NONBLOCK لواصف الملف (file descriptor) الأساسي.

مصادر