التابع spawn
الخاص بالصنف Kernel
في روبي
ينفذ التابع spawn تعليمة محددة، ثم يعيد معرفها (pid).
يشبه هذا التابع #system
ـ غير أنّه لا ينتظر إلى أن ينتهي تنفيذ الأمر.
يجب على العملية الأم (parent process) أن تستخدم Process.wait
لتحصيل حالة الإنهاء للعملية الفرعية، أو تستخدم Process.detach
لتسجيل عدم الاهتمام بحالتها؛ خلاف ذلك، قد يُراكم نظام التشغيل عمليات ميتة (zombie processes).
التابع spawn لديه مجموعة من الخيارات لتحديد خصائص العملية:
env: hash
name => val : set the environment variable
name => nil : unset the environment variable
the keys and the values except for +nil+ must be strings.
command...:
commandline : command line string which is passed to the standard shell
cmdname, arg1, ... : command name and one or more arguments (This form does not use the shell. See below for caveats.)
[cmdname, argv0], arg1, ... : command name, argv[0] and zero or more arguments (no shell)
options: hash
clearing environment variables:
:unsetenv_others => true : clear environment variables except specified by env
:unsetenv_others => false : don't clear (default)
process group:
:pgroup => true or 0 : make a new process group
:pgroup => pgid : join the specified process group
:pgroup => nil : don't change the process group (default)
create new process group: Windows only
:new_pgroup => true : the new process is the root process of a new process group
:new_pgroup => false : don't create a new process group (default)
resource limit: resourcename is core, cpu, data, etc. See Process.setrlimit.
:rlimit_resourcename => limit
:rlimit_resourcename => [cur_limit, max_limit]
umask:
:umask => int
redirection:
key:
FD : single file descriptor in child process
[FD, FD, ...] : multiple file descriptor in child process
value:
FD : redirect to the file descriptor in parent process
string : redirect to file with open(string, "r" or "w")
[string] : redirect to file with open(string, File::RDONLY)
[string, open_mode] : redirect to file with open(string, open_mode, 0644)
[string, open_mode, perm] : redirect to file with open(string, open_mode, perm)
[:child, FD] : redirect to the redirected file descriptor
:close : close the file descriptor in child process
FD is one of follows
:in : the file descriptor 0 which is the standard input
:out : the file descriptor 1 which is the standard output
:err : the file descriptor 2 which is the standard error
integer : the file descriptor of specified the integer
io : the file descriptor specified as io.fileno
file descriptor inheritance: close non-redirected non-standard fds (3, 4, 5, ...) or not
:close_others => true : don't inherit
current directory:
:chdir => str
The 'cmdname, arg1, ...' form does not use the shell. However,
on different OSes, different things are provided as built-in
commands. An example of this is 'echo', which is a built-in
on Windows, but is a normal program on Linux and Mac OS X.
This means that `Process.spawn 'echo', '%Path%'` will display
the contents of the `%Path%` environment variable on Windows,
but `Process.spawn 'echo', '$PATH'` prints the literal '$PATH'.
إن كانت القيمة أالمعطاة للوسيط XXXX قاموسًا (hash)، فسيتم تحديث البيئة بواسطة env
قبل env
في العملية الفرعية. إن كان لأحد مدخلات exec(2)
القيمة nil، فسيُحذف ذلك المتغير.
إن كانت القيمة أالمعطاة للوسيط env
قاموسًا، فسيحدد مجموعة العمليات (process group)، وينشئ مجموعة عمليات جديدة، ويحدد الموارد، والمجلد الحالي، وتقنيع (umask) وإعادة التوجيه العملية الفرعية. يمكن أيضًا تحديدها لمحو متغيرات البيئة.
المفتاح options
في :unsetenv_others
يؤدي إلى محو متغيرات البيئة فضلًا عن تلك المحددة بواسطة options
.
يحدد المفتاح env
في :pgroup
مجموعة العملية. يجب أن تساوي القيمة المقابلة true، أو صفر، أو عددًا صحيحًا موجبًا، أو nil. القيمتان true وصفر تجعلان العملية عمليةً قائدة (process leader) لمجموعة عمليات جديدة. عدد صحيح موجب غير معدوم يجعل العملية تنضم إلى مجموعة العمليات المعطاة. أما القيمة الافتراضية nil، فتُبقي العملية في نفس مجموعة العمليات.
المفتاح options
في :new_pgroup
يؤدي إلى تمرير الراية options
إلى CREATE_NEW_PROCESS_GROUP
، والتي هي واجهة برمجية لنظام ويندوز (Windows API). هذا الخيار متاح فقط لنظام التشغيل ويندوز. القيمة true تعني أن العملية الجديدة ستكون العملية الجذرية لمجموعة العمليات الجديدة. يتم تعطيل CTRL + C في العملية الجديدة. هذه الراية ضرورية لـ CreateProcessW()
في العملية الفرعية. قيمة :new_pgroup تساوي false افتراضيًا.
يحدد المفتاح Process.kill(:SIGINT,
pid)
foo حدود الموارد. يجب أن تكون foo إحدى أنواع الموارد مثل :rlimit_
. ويجب أن تكون القيمة المقابلة إما عددًا صحيحًا، أو مصفوفة تحتوي على عدد أوعددين صحيحين: مثل الوسيطين cur_limit و max_limit في core
.
يحدد المفتاح Process.setrlimit
في :umask
التقنيع (umask).
تحدد المفاتيح: :in, و :out و :err و، عدد من integer، وكائن options
و مصفوفة إعادة توجيه. إعادة التوجيه تحدد واصف ملف (file descriptor) في العملية التابعة.
على سبيل المثال، يمكن دمج stderr في stdout كما يلي:
تحدد مفاتيح القاموس واصف ملف في العملية الفرعية التي بدأها IO
. أما err، 2 و STDERR فيعيّنان مجرى الخطأ القياسي (stderr).
تعيّن قيم القاموس واصف ملف في العملية الأم، والتي تستدعي spawn
. : out، فيما يحدد :out, 1 و STDOUT ي مجرى الإخراج القياسي (stdout).
في المثال أعلاه، لم يُحدّد مجرى الإخراج القياسي في العملية الفرعية. لذلك فهو يرثها من العملية الأم.
يمكن تحديد مجرى الإدخال القياسي (stdin) بواسطة: :in, 0 و STDIN.
يمكن تحديد اسم ملف كقيمة في قاموس.
بالنسبة إلى stdout و stderr (أو توليفة منهما) ، يتم فتحهما في وضع الكتابة. وإلا فسيُعتمد وضع القراءة خلاف ذلك. لتحديد رايات وأذونات إنشاء الملفات بشكل صريح، يتم استخدام مصفوفة بدلاً من ذلك.
تحدد المصفوفة اسم الملف والرايات والأذونات. الرايات قد تكون سلاسل نصية أو أعدادًا صحيحة. إذا حُذفت الرايات أو أعطيت القيمة nil، فستُفترض File :: RDONLY. يجب أن يكون الإذن عددًا صحيحًا. إذا تم حذف الإذن أو كان يساوي nil، يتم افتراض القيمة 0644. إذا تم تحديد مصفوفة من كائنات IOs ومن الأعداد الصحيحة كمفتاح للقاموس، سيتم إعادة توجيه جميع العناصر.
هناك طريقة أخرى لدمج عدة واصفات ملفات وهي [: child، fd]. والتي تعني واصف الملف في العملية الفرعية. وهو مختلف عن fd. على سبيل المثال،: err =>: out تعني إعادة توجيه المجرى stderr الفرعي إلى المجرى stdout الأم. ولكن: err => [: child،: out] تعني إعادة توجيه المجرى stderr الفرعي إلى المجرى stdout الفرعي. سيكونان مختلفان إذا أُعيد توجيه المجرىلففا stdout في العملية الفرعية على النحو التالي.
يمكن استخدام [: child،: out] لدمج المجرى stderr في المجرى stdout في spawn
. في هذه الحالةا، يعيد IO.popen
توجيه المجرى stdout إلى أنبوب (pipe) في العملية الفرعية، حيث تشير [: child ،: out] إلى المجرى stdout المعاد توجيهه.
يحدد المفتاح IO.popen
في :chdir
المجلد الحالي.
تغلق spawn افتراضيا جميع الواصفات غير المحددة وغير القياسية. الواصفات "القياسية" هي 0 و 1 و 2. يتم تحديد هذا السلوك بواسطة الخيار: close_others. الخيار: close_others لا يؤثر على الواصفات القياسية، التي يتم إغلاقها فقط في حالة تم تحديد :close بشكل صريح.
قيمة: close_others تساوي true بشكل افتراضي بالنسبة للتابع spawn و options
.
لاحظ أنه العناصر fds التي تم تعيين الراية خاصتها close-on-exec ستُغلق بغض النظر عن الخيار close_others.
لذلك يمكن استخدام IO.popen
و spawn كـ IO.pipe
.
يتم تحديد :close كقيمة قاموس لإغلاق عنصر fd بشكل فردي.
إذا كانت هناك حاجة إلى توريث واصف الملف، فيمكن استخدام io => io.
من الممكن أيضًا تبادل واصفات الملفات.
تحدد مفاتيح القاموس واصفات الملفات في العملية الفرعية. فيما تحدد قيم القاموس واصفات الملفات في العملية الأم. بهذا يحدد المثال أعلاه تبادل المجريين stdout و stderr. داخليًا، يستخدم IO.popen
واصف ملف إضافي لحل هذا التعيين الدوري لواصفات الملفات.
راجع صفحة spawn
لأجل لمزيد من المعلومات بخصوص الصدفة (shell) القياسية.
البنية العامة
spawn([env,] command... [,options]) → pid
spawn([env,] command... [,options]) → pid
المعاملات
env
command...
options
القيمة المُعادة
أمثلة
مثال على استخدام التابع spawn
:
pid = spawn("tar xf ruby-2.0.0-p195.tar.bz2")
Process.wait pid
pid = spawn(RbConfig.ruby, "-eputs'Hello, world!'")
Process.wait pid
انظر أيضا
- التابع
sleep
: يعلّق التابع sleep المهمة الفرعية (thread) الحالية لعدد من الثواني (والذي قد بكون أي عدد، بما في ذلكFloat
مع كسور ثوان). ثم يعيد عدد الثواني الفعلي (بالتقريب) الذي نامتها المهمة الفرعية، والذي قد يكون أقل من العدد المطلوب إن استدعت مهمة فرعية أخرىThread#run
. في حال استدعائها دون تمرير أي وسيط، ستقوم sleep() بتنويم المهمة الفرعية إلى الأبد. - التابع
sprintf
: يعيد التابع sprintf السلسلة النصية الناتجة من تطبيق format_string على الوسائط الإضافية. داخل سلسلة التنسيق، يتم نسخ كل الأحرف في النتيجة باستثناء تسلسلات الشكل .