التابع Process.detach
في روبي
تحتفظ بعض أنظمة التشغيل بحالة العمليات الفرعية التي أُنهيَت حتى تجمع العملية الأب تلك الحالة (باستعمال أنواع مختلفة من 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).