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

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

تحتفظ بعض أنظمة التشغيل بحالة العمليات الفرعية التي أُنهيَت حتى تجمع العملية الأب تلك الحالة (باستعمال أنواع مختلفة من wait()‎). إن لم تجمع العملية الأب هذه الحالة على الإطلاق، تبقى العملية الابن متراكمة ضمن العمليات الميتة (zombie process). يمنع التابع Process::detach هذا السلوك عبر ضبط خيط منفصل من روبي وظيفته الوحيدة هي جمع الحالة لمعرف العملية (pid) عندما تُنهَى. استعمل التابع detach فقط عندما لا تنوي انتظار العملية الابن لكي تُنهَى بشكل صريح.

يعيد الخيط المُنتَظِر (waiting thread) حالة الخروج للعملية المنفصلة عندما تُنهَى، لذا يمكنك استعمال Thread.join لمعرفة النتيجة. إن لم يكن مُعرِّف العملية pid معرِّف عملية ابن صالح، فسيُعيد الخيط القيمة nil مباشرةً.

يملك الخيط المنتظر التابع pid الذي يعيد قيمة مُعرِّف العملية.

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

detach(pid)  thread

المعاملات

pid

مُعرِّف العملية المراد تطبيق العملية عليها.

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

يعاد خيط يمثِّل الخيط المُنتَظِر (waiting thread) الذي يعيد حالة الخروج للعملية المنفصلة عندما تُنهَى.

أمثلة

في المثال التالي، لا نجمع حالة العملية الابن الأولى، لذا ستظهر في عداد العمليات الموتى:

p1 = fork { sleep 0.1 }
p2 = fork { sleep 0.2 }
Process.waitpid(p2)
sleep 2
system("ps -ho pid,state -p #{p1}")

تنفيذ هذا المثال يُنتِج:

27389 Z

أمَّا في المثال التالي، يُستعمَل التابع detach لجمع حالة العملية تلقائيًّا:

p1 = fork { sleep 0.1 }
p2 = fork { sleep 0.2 }
Process.detach(p1)
Process.waitpid(p2)
sleep 2
system("ps -ho pid,state -p #{p1}")

لا ينتج عن تنفيذ هذا المثال أية مخرجات.

انظر أيضًا

  • التابع clock_gettime: يعيد الوقت المعادة عبر الدالة clock_gettime()‎ التي تخص POSIX.
  • التابع daemon: يفصل العملية من طرفية التحكم ويُشغِّلها في الخلفية كجوهرة نظام (system daemon).

مصادر