التابع Process.exec في روبي

من موسوعة حسوب
< Ruby‏ | Process
مراجعة 09:09، 2 يناير 2019 بواسطة جميل-بيلوني (نقاش | مساهمات) (إنشاء الصفحة.)
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

يستبدل التابع exec العملية الحالية عبر تشغيل الأمر الخارجي المعطى.

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

exec([env,] command... [,options])

يمكن أن يأخذ التابع عند استعماله لتنفيذ الأمر الخارجة المعطى أحد الأشكال التالية:

  • exec(commandline)‎: الأمر هو سلسلة نصية تُمرَّر إلى الصدفة القياسية (standard shell).
  • exec(cmdname, arg1, ...)‎: يُمرَّر إلى التابع اسم الأمر ووسيط واحد أو أكثر (بدون صدفة).
  • exec([cmdname, argv0], arg1, ...)‎: يُمرَّر إلى التابع اسم الأمر والوسيط argv فقط أو وسيط آخر أو أكثر (بدون صدفة).

في الشكل الأول، تُؤخذ السلسلة النصية كسطر أمري يخضع إلى توسعة الصدفة (shell expansion) قبل تنفيذه.

الصدفة القياسية تعني "‎/bin/sh" دومًا في الأنظمة الشبيهة بيونكس مثل ENV["RUBYSHELL"]‎ (أو ENV["COMSPEC"]‎ على أنظمة ويندوز NT) وما شابه.

إن تبعت السلسلة النصية في الشكل الأول (exec("command")‎) القاعدتين التاليتين:

  • عدم وجود محارف خاصة (meta characters).
  • عدم وجود كلمات محجوزة خاصة بالصدفة أو كلمات خاصة مضمَّنة.

فيمكن إجبار استدعاء الصدفة عبر إضافة فاصلة منقوطة ";" إلى السلسلة النصية (لأن ";" يعدُّ محرفًا خاصًّا).

انتبه إلى أنَّ هذا السلوك يمكن رؤيته عبر مُعرِّف العملية pid الذي سبق الحصول عليه (القيمة المعادة من spawn()‎ و IO.pid من أجل IO.popen) للأمر المستدعى وليس للصدفة.

في الشكل الثاني (exec("command1", "arg1", ...)‎)، يُؤخَذ المعامل الأول على أنَّه اسم أمرٍ وبقية المعاملات المُمرَّرة على أنَّها معاملات يراد تمريرها إلى الأمر بدون توسعة الصدفة.

في الشكل الثالث (exec(["command", "argv0"], "arg1", ...)‎)، يُمرَّر بداية إلى التابع مصفوفة بعنصرين الأول هو الأمر المراد تنفيذه والثاني يُستعمَل على أنَّه القيمة argv[0]‎ التي قد تظهر في قوائم العملية.

من أجل تنفيذ الأمر، تُستخدَم إحدى دالتي النظام exec(2)‎؛ لذلك، قد يرث الأمر الذي يجري تنفيذه بعض متغيرات البيئة للبرنامج الأصلي (من ضمنها واصفات الملفات المفتوحة). يُعدَّل هذا السلوك عبر المعاملين env والمعامل options. اطلع على توثيق التابع spawn لمزيد من التفاصيل.

إن فشل تنفيذ الأمر (حدوث الخطأ Errno::ENOENT عادةً عندما لا يُعثَر عليه)، يُطلَق الاستثناء SystemCallError.

الخاصيات المُعدَّلة قد يُحافَظ عليها عند فشل دالة النظام exec(2)‎. ولكن، على سبيل المثال، قيود مورد صلب (hard resource limits) غير قابلة للاستعادة.

خذ في حسبانك بإنشاء عملية ابن باستعمال التابع spawn أو Kernel.system إن كان ذلك غير مقبول.

المعاملات

env

متغيرات البيئة المراد تعديلها وضبطها من أجل الأمر المراد تنفيذه.

command

الأمر المراد تنفيذه.

options

خيارات تُستعمَل لتعديل خاصيات العملية قبل استدعاء النظام exec(2)‎. اطلع على التابع spawn للمزيد من التفاصيل حول المعامل options.

أمثلة

مثال على استعمال التابع exec:

exec "echo *"       # اظهار قائمة الملفات في المجلد الحالي
# never get here

exec "echo", "*"    # * اظهار الرمز 
# never get here

انظر أيضًا

  • التابع egid: يعيد مُعرِّف المجموعة الفعال (effective group ID) المالكة لهذه العملية.
  • التابع fork: ينشئ عملية فرعية.

مصادر