كيفية معرفة ما اذا كان عملية مع معرف المنتج X هو غيبوبة؟
سؤال
وحصلت على PID لعملية وأنا بحاجة لمعرفة ما اذا كان هو غيبوبة باستخدام نظام POSIX تدعو في C. كيف أفعل ذلك؟
والمشكلة أواجه هو أن لدي عملية والشوك إلى العديد من الأطفال، والأطفال عن القيام إإكسكس وأحيانا أريد أن تفعل إكسيك في الخلفية بحيث لا أستطيع الانتظار حقا () الأطفال التي تذهب في الخلفية. أنا يمكن أن تنتظر () بشكل دوري (مرة واحدة في حياتي حلقة رئيسية) ولكني في حاجة لمعرفة أي العمليات هي غيبوبة حتى لا يتعطل عملية الدي في انتظار الأطفال الذين لن ينتهي قريبا.
إذا كنت غريبة، أنا بناء قذيفة يونيكس وهو في طبيعة قذيفة لديها أطفال العمليات تتصرف بشكل غير متزامن.
المحلول
وأنت لا يمكن أن تحقق ما إذا كانت العملية هي غيبوبة مع POSIX النقي تدعو - إلا إذا كنت عملية الأصل، وجني ذلك مع <لأ href = "http://opengroup.org/onlinepubs/007908799/ xsh / wait.html "يختلط =" noreferrer "> دعوة wait
الأسرة . لذلك عليك أن تجد مكانا جيدا للانتظار للطفل.
وخيار واحد هو وضع معالج SIGCHLD
والقيام waitpid(0, &status, WNOHANG)
هناك. تأكد من حلقة حتى أنه لم يعد يجد أي عمليات - إذا يموت طفلان في فترة زمنية قصيرة، قد تحصل فقط SIGCHLD
واحد
وثمة خيار آخر هو شوكة مزدوجة - وهذا هو، fork()
، لديها طفل (يطلق عليه الطفل A) شوكة مرة أخرى، لديها طفل ثان (طفل B) إكسيك. ثم الطفل ويخرج على الفور. وفي الوقت نفسه هو الأصل wait()
ing للطفل A. عندما ذهب الطفل A، وعملية تهيئة للنظام رعاية الطفل جني B عندما يموت في نهاية المطاف. هذا الأسلوب هو أكثر بساطة، ولكن قذيفة لديك أي وسيلة لمعرفة متى يموت طفل B، لذلك إذا كنت بحاجة إلى هذه المعلومات، واستخدام الأسلوب السابق.
نصائح أخرى
ولكن .. ولكن .. في غيبوبة طفلا (في بعض المستويات) وعملية وهذا ما هو فحص أحد الوالدين، أليس كذلك؟ لذلك إذا كنت تشعر بالقلق لأنه معرف المنتج المحدد هو غيبوبة لماذا لا مجرد القيام waitpid(2)
مع WNOHANG
والتخلص منه؟ الآن، وهذا سوف تستهلك حالة خروج، لذلك قد يكون فكرة سيئة اذا كان بعض عملية أخرى قد ترغب في wait
حقا في المستقبل.
ولقد ذكرتم أن كنت بناء قذيفة يونكس. يجب عليك قراءة هذا: التعامل الصحيح مع SIGINT / SIGQUIT
وعادة، يتحقق قذيفة للأطفال البائد قبل فترة وجيزة طباعة موجه لها - باستخدام استدعاء نظام waitpid(2)
والخيار WNOHANG
كما سبق ذكره. قد ترغب أيضا معالج SIGCHLD - ولكن عليك أن تقرر ما كنت تنوي القيام به مع المعلومات إذا كنت مشغولا انتظار بعض عملية الأمامية لإنهاء وهو في الواقع عملية خلفية أن ينهي ص. >
وهذه ليست سوى الاختلاف طفيف على الاجابة المحدد حاليا.
وماذا عن قذيفة الأمر 'ملاحظة' الذي يظهر لك جدول العمليات النشطة حيث يمكنك أن تجد أن العملية "المنحلة"؟ أعتقد يجب أن يكون هناك طريقة للحصول على تلك المعلومات من التعليمات البرمجية ج.