الفرق بين المراجعتين ل"Ruby/Kernel/spawn"

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

مراجعة 17:22، 22 أكتوبر 2018

ينفذ التابع spawn تعليمة محددة، ثم يعيد معرفها (pid).

pid = spawn("tar xf ruby-2.0.0-p195.tar.bz2")
Process.wait pid

pid = spawn(RbConfig.ruby, "-eputs'Hello, world!'")
Process.wait pid

يشبه التابعُ spawn التابعَ systemـ غير أنّه لا ينتظر إلى أن ينتهي تنفيذ الأمر.

يجب على العملية الأم (parent process) أن تستخدم التابع Process.wait لتحصيل حالة الإنهاء للعملية الفرعية، أو تستخدم Process.detach لتسجيل عدم الاهتمام بحالتها؛ خلاف ذلك، قد يُراكم نظام التشغيل عمليات ميتة (zombie processes).

التابع spawn لديه مجموعة من الخيارات لتحديد خصائص العملية:

env: hash
  name => val : يضبط متغيرات البيئة
  name => nil :يلغي ضبط متغيرات البيئة
   +nil+ ينبغي تكون المفاتيح والقيم سلاسل نصية باستثناء 
command...:
  commandline                 : تعليمة نصية تُمرر إلى الصدفة القياسية
  cmdname, arg1, ...          : تعليمة وواحد أو أكثر من الوسائط (هذا الشكل لا يستخدم 
                                 الصدفة)
  [cmdname, argv0], arg1, ... :  ووسيط واحد أو أكثر  argv[0]  تعليمة و
o ptions: hash
  clearing environment variables: (محو متغيرات البيئة)
    :unsetenv_others => true   :  env محو متغيرات البيئة باستثناء المحددة من قبل
    :unsetenv_others => false  : لا تمحو المتغيرات - افتراضي
  process group: (مجموعة العمليات)
    :pgroup => true or 0 : انشاء مجموعة عمليات جديدة
    :pgroup => pgid      : الانضمام إلى مجموعة العمليات المحددة
    :pgroup => nil       : عدم تغيير مجموعة العمليات - افتراصي)
  create new process group: Windows only  انشاء مجموعة عمليات جديدة، في الويندوز فقط
    :new_pgroup => true  : العملية الجديدة هي العملية الأصل لمجموعة عمليات جديدة
    :new_pgroup => false : لا تنشئ مجموعة عمليات جديدة - افتراضي
  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              : واصف ملف واحد في العملية الفرعية
      [FD, FD, ...]   : واصف ملف متعدد في العمليةالفرعية
    value:
      FD                        : يعيد التوجيه إلى واصف الملف في العملية الأم
      string                    : open(string, "r" or "w")  يعيد التوجيه إلى الملف صاحب
      [string]                  : open(string, File::RDONLY) يعيد التوجيه إلى الملف صاحب
      [string, open_mode]     :open(string, open_mode, 0644) يعيد التوجيه إلى الملف صاحب
     [string, open_mode, perm]:open(string, open_mode, perm) يعيد التوجيه إلى الملف صاحب
      [:child, FD]              : يعيد التوجيه إلى واصف الملف الموجه
      :close                    : يغلق واصف الملف في العملية الفرعية
    FD is one of follows
      :in     : واصف الملف رقم 0 والذي هو المدخل القياسي
      :out    : واصف الملف رقم 1 والذي هو المخرج القياسي
      :err    : واصف الملف رقم 2 والذي هو مجرى الخطأ القياسي
      integer : واصف الملف ذو الرقم المحدد
      io      :  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
 لا يستخدم النموذج 'cmdname، arg1، ...' shell. ومع ذلك ، على أنظمة تشغيل مختلفة ، يتم توفير أشياء مختلفة كأوامر مدمجة. مثال على ذلك هو "echo" ، وهو مدمج في Windows ، ولكنه برنامج عادي على Linux و Mac OS X. وهذا يعني أن 'Process.spawn' echo '،'٪ Path٪ 'سيعرض محتويات متغير بيئة `٪ Path ٪` على Windows ، لكن` Process.spawn 'echo' ، '$ PATH'` يطبع الحرف' $ 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 على الوسائط الإضافية. داخل سلسلة التنسيق، يتم نسخ كل الأحرف في النتيجة باستثناء تسلسلات الشكل .

مصادر