التابع popen
الخاص بالصنف IO
في روبي
ينفذ التابع popen
التعليمة المعطاة كعملية فرعية (subprocess)؛ مع توصيل المجرَيَين القياسيين للمدخلات والمخرجات للعملية الفرعية مع مجرى د/خ المُعاد.
يمكن الحصول على على معرف العملية (PID) عبر التابع pid
.
الوسيط cmd
سيكون إما سلسلة نصية أو مصفوفة كما هو موضح أدناه.
cmd:
"-" : fork
commandline : سلسلة نصية تُمرر إلى الصدفة
[env, cmdname, arg1, ..., opts] : اسم التعليمة مع عدد من الوسائط بدون صدفة
[env, [cmdname, argv0], arg1, ..., opts]:مع عدد من الوسائط دون صدفةو argv[0] اسم التعليمة
(اختياريان env و opts)
إن كان cmd
يساوي "-
"، فستُشغّل نسخة (instance) جديدة من روبي كعملية فرعية.
إن كان cmd
عبارة عن مصفوفة من السلاسل النصية، فسيتم استخدامه كعملية فرعية في argv
بحيث يتجاوز الصدفة (shell). يمكن أن تحتوي المصفوفة على قاموس في البداية لتحديد معطيات بيئة التشغيل، وقاموس في الأخير لتحدبد الخيارات بشكل مشابه للتابع spawn
.
الوضع الافتراضي للملف الجديد هو "r
"، ولكن قد يتم تعيين الوضع mode
عند أي من الأوضاع المذكورة في وصف الصنف IO
. ويحدد الوسيط الأخير opt
الوضع mode
.
# 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
}
سيُطلق الاستثناءات التي أطلقها التابعان IO.pipe
و Kernel.spawn
.
في حال إعطاء كتلة، فستُنفذ روبي التعليمة كعملية فرعية مرتبطة بروبي عبر أنبوب (pipe). سيُمرّر الطرف المقابل لروبي كوسيط إلى الكتلة. في نهاية الكتلة، ستغلق روبي الأنبوب وتعيّن قيمة $?
. في هذه الحالة، سيعيد التابع IO.popen
قيمة الكتلة.
في حال إعطاء كتلة، وكانت قيمة cmd
مساوية للسلسلة النصية "-
"، فسيتم تنفيذ الكتلة في عمليتين منفصلتين: مرة في العملية الأم (parent)، ومرة في العملية الإبن (child). سيُمرّر الأنبوب إلى العملية الأم كوسيط إلى الكتلة، فيما سيتم تمرير القيمة nil
إلى الكتلة المُنفّذة في العملية الإبن، وسيتم توصيل مجريا المدخلات والمخرجات القياسيين الخاصين بالعملية الإبن والعملية الأم عبر الأنبوب. هذا غير متوفر على جميع الأنظمة.
البنية العامة
popen([env,] cmd, mode="r" [, opt])→ io
popen([env,] cmd, mode="r" [, opt]) {|io| block } → obj
المعاملات
env
إعدادات البيئة.
cmd
تعليمة.
mode
الوضعية
opt
خيارات
القيمة المُعادة
يعاد مجرى د/خ أو يعاد ناتج الكتلة البرمجية في حال تمريرها.
أمثلة
مثال على استخدام التابع popen
:
f = IO.popen("uname")
p f.readlines
f.close
puts "Parent is #{Process.pid}"
IO.popen("date") {|f| puts f.gets }
IO.popen("-") {|f| $stderr.puts "#{Process.pid} is here, f is #{f.inspect}"}
p $?
IO.popen(%w"sed -e s|^|<foo>| -e s&$&;zot;&", "r+") {|f|
f.puts "bar"; f.close_write; puts f.gets
}
الناتج:
["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;
انظر أيضا
- التابع
pipe
: ينشئ التابعpipe
زوجًا من مداخل الأنابيب (pipe endpoints) (متصلة ببعضها البعض) ثم يعيدها على هيئة مصفوفة.