سؤال

أنا حاليًا في فصل دراسي لأنظمة التشغيل، وقد قضى معلمي نصف فترة الفصل في الحديث عن معرّفات PID.وذكرت، كما يعلم الكثيرون، أن العمليات تعرف هوية والديهم.

سؤالي هو هذا:

هل يعرف PCB الخاص بالعملية معرف الطفل الخاص به؟وإذا كان الأمر كذلك، فما هو السبيل للحصول عليه؟

هل كانت مفيدة؟

المحلول

بقدر ما أعرف، لا تحتوي العملية على قائمة واضحة بمعرفات PID الخاصة بأطفالها، ولكن يمكن بناؤها بسهولة، حيث يجب أن تعرف العملية العمليات الفرعية التي تنتجها.على سبيل المثال، يقوم استدعاء UNIX fork() بإرجاع معرف PID التابع في العملية الأصلية و0 في العملية الفرعية، بينما يقوم CreateProcess() على Windows بإرجاع (IIRC) معرف PID للعملية الجديدة التي تم إنشاؤها.

نصائح أخرى

عندما تستخدم fork() في *nix، القيمة المرجعة هي معرف المنتج (PID) الخاص بالطفل في العملية الأصلية، و0 في العملية الفرعية.هذه طريقة واحدة لمعرفة ذلك.

لست متأكدًا مما إذا كانوا يتتبعون "شجرة" إنتاج العملية، أعتقد أن ذلك يعتمد على نظام التشغيل الذي تستخدمه، ولكن عندما تقتل bash (أو أي غلاف)، يتم أيضًا قتل جميع الأطفال قيد التشغيل، وأعتقد أن الأنظمة مثل UNIX تفعل ذلك تتبع هذا.

إذا كنت تستخدم نظام التشغيل Linux أو أي شيء يقوم بتنفيذ واجهات برمجة تطبيقات Unix، فعندما تستدعي إحدى العمليات fork() لإنشاء عملية فرعية، يتلقى الأصل معرف PID الفرعي كرمز الإرجاع، أو -1 إذا فشلت عملية التفرع.تحصل العملية الفرعية على رمز إرجاع صفري.

يعرف PCB الخاص بالعملية معرف الطفل الخاص به.

كما نعلم، يتم استخدام Fork() لإنشاء العمليات. ولا يأخذ أي وسيطات ويعيد معرف العملية. بعد إنشاء عملية فرعية جديدة، سيقوم كل من الوالدين والطفل بتنفيذ التعليمات التالية بعد fork().علينا أن نميز بين الأصل والطفل. ويمكن القيام بذلك عن طريق اختبار القيمة المرجعة للشوكة ().

إذا قامت Fork() بإرجاع قيمة سالبة، فلن ينجح إنشاء العملية الفرعية.إذا قامت Fork() بإرجاع الصفر إلى العملية الفرعية المنشأة حديثًا.إذا قامت Fork() بإرجاع قيمة موجبة كمعرف عملية للعملية الفرعية إلى العملية الأصلية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top