الفرق بين المراجعتين ل"Ruby/IO/write nonblock"
(أنشأ الصفحة ب'<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>write_nonblock</code> [[Ruby/String|السلسلة النصية]] المعطاة في [[Ruby/IO|مجرى د/خ]] الذي استُدعي معه باستخدام استدعاء النظام <code>write(2)</code> بعد تعيين قيمة الراية <code>O_NONBLOCK</code> الخاصة بواصف الملف (file descriptor) الأساسي. ثم يعيد عدد البايتات المكتوبة. |
− | + | يستدعي التابع <code>write_nonblock</code> استدعاء النظام <code>write(2)</code>. ويتسبب في كافة الأخطاء التي يتسبب فيها استدعاء النظام <code>write(2)</code>، مثل <code>Errno::EWOULDBLOCK</code> و <code>Errno::EINTR</code> وغيرهما. قد تكون النتيجة أصغر من طول [[Ruby/String|السلسلة النصية]] (أي أن الكتابة جزئية). لذا يجب أن يعالج المستدعي هذه الأخطاء، إضافة إلى مسألة الكتابة الجزئية. | |
− | + | إن كان الاستثناء يساوي <code>Errno::EWOULDBLOCK</code> أو <code>Errno::EAGAIN</code>، فسيتم توسيعه بواسطة <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>[[Ruby/IO/write nonblock|write_nonblock]]</code> الاستثناء <code>Errno::EBADF</code>. | ||
− | + | عبر إعطاء الوسيط المسمى (keyword argument) <code>exception</code> القيمة <code>false</code>، يمكنك منع التابع <code>write_nonblock</code> من إطلاق الاستثناء <code>[[Ruby/WaitWritable|IO::WaitWritable]]</code>، وجعله يُعيد [[Ruby/Symbol|الرمز]] <code>:wait_writable</code> بدلاً من ذلك. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | عبر إعطاء الوسيط المسمى (keyword argument) <code>exception</code> | ||
==البنية العامة== | ==البنية العامة== | ||
<syntaxhighlight lang="ruby">write_nonblock(string)→ integer | <syntaxhighlight lang="ruby">write_nonblock(string)→ integer | ||
سطر 33: | سطر 30: | ||
خيارات | خيارات | ||
==القيمة المُعادة== | ==القيمة المُعادة== | ||
+ | يعيد التابع <code>write_nonblock</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. | ||
سطر 44: | سطر 42: | ||
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>[[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 في توثيق روبي الرسمي.] |
مراجعة 21:53، 13 نوفمبر 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
عدد البايتات المكتوبة.
أمثلة
مثال على استخدام التابع 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)
انظر أيضا
- التابع
write
: يكتب السلاسل النصية المعطاة في مجرى د/خ