التابع popen‎ الخاص بالصنف IO في روبي

من موسوعة حسوب
< Ruby‏ | IO
مراجعة 23:07، 12 نوفمبر 2018 بواسطة محمد-بغات (نقاش | مساهمات) (أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: التابع <code>popen‎</code> الخاص بالصنف <code>IO</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: R...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

ينفذ التابع popen التعليمة المعطاة (انظر فقرة البنية العامة) على شكل عملية فرعي (subprocess)؛ سيتم توصيل المدخلات والمخرجات القياسية للعملية الفرعية إلى مجرى د/خ (IO) المُعاد.

يمكن الحصول على على معرف العملية (PID) التي بدأت عبر التابع #pid.

الوسيط cmd هو إما سلسلة نصية أو مصفوفة كما هو موضح أدناه.

cmd:
  "-"                                      : fork
  commandline                              : command line string which is passed to a shell
  [env, cmdname, arg1, ..., opts]          : command name and zero or more arguments (no shell)
  [env, [cmdname, argv0], arg1, ..., opts] : command name, argv[0] and zero or more arguments (no shell)
(env and opts are optional.)

إن كان cmd يساوي String "-"، فسيتم بدء تشغيل نسخة (instance) جديدة من روبي كعملية فرعية.

إن كان cmd عبارة عن مصفوفة Array من السلاسل النصية String، فسيتم استخدامه كعملية فرعية في argv بحيث يتجاوز shell. يمكن أن تحتوي المصفوفة على قاموس في البداية لتحديد معطيات بيئة التشغيل، وقاموس في الأخير لتحدبد الخيارات بشك مشابه للتابع spawn.

الوضع الافتراضي لكائن الملف الجديد هو "r"، ولكن قد يتم تعيين mode عند أي من الأوضاع المذكورة في وصف الصنف IO. الوسيط الأخير opt يؤهل mode.


سيُطلق الاستثناءات التي أطلقتها IO.pipe و Kernel.spawn.

في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر طرف النهاية المقابل لروبي في الأنبوب كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة $?. وفي هذه الحالة، سيعيد التابع IO.popen قيمة الكتلة.

في حال إعطاء كتلة، وكانت قيمة cmd مساوية السلسلة النصية "-"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة العملية الأم (parent)، ومرة ​في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة nil إلى للكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن بالعملية الأم عبر الأنبوب. غير متوفر على جميع الأنظمة الأساسية.


produces:

["Linux\n"]
Parent is 21346
Thu Jan 15 22:41:19 JST 2009
21346 is here, f is #<IO:fd 3>
21352 is here, f is nil
#<Process::Status: pid 21352 exit 0>
<foo>bar;zot;

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

popen([env,] cmd, mode="r" [, opt]) io
popen([env,] cmd, mode="r" [, opt]) {|io| block }  obj

المعاملات

env‎

cmd‎

mode‎

الوضعية

opt‎

خيارات

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

أمثلة

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

# set IO encoding
IO.popen("nkf -e filename", :external_encoding=>"EUC-JP") {|nkf_io|
  euc_jp_string = nkf_io.read
}
# merge standard output and standard error using
# spawn option.  See the document of Kernel.spawn.
IO.popen(["ls", "/", :err=>[:child, :out]]) {|ls_io|
  ls_result_with_error = ls_io.read
}
# spawn options can be mixed with IO options
IO.popen(["ls", "/"], :err=>[:child, :out]) {|ls_io|
  ls_result_with_error = ls_io.read
}

انظر أيضا

  • التابع pipe: ينشئ التابع pipe زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة مصفوفة ثنائية من مجريات د/خ IO:‏ [ read_io و write_io ].
  • التابع read: يفتح التابع read الملف، ثم يتموضع اختياريا في الموضع المعطى offset (انظر فقرة البنية العامة)، ثم يُعيد length بايت (تساوي قيمته الافتراضية طول بقية الملف). يضمن التابع read أن يُغلق الملف قبل العودة.

مصادر