كيفية معرفة ما اذا كان عملية مع معرف المنتج X هو غيبوبة؟

StackOverflow https://stackoverflow.com/questions/1619020

  •  06-07-2019
  •  | 
  •  

سؤال

وحصلت على 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 - ولكن عليك أن تقرر ما كنت تنوي القيام به مع المعلومات إذا كنت مشغولا انتظار بعض عملية الأمامية لإنهاء وهو في الواقع عملية خلفية أن ينهي

وهذه ليست سوى الاختلاف طفيف على الاجابة المحدد حاليا.

وماذا عن قذيفة الأمر 'ملاحظة' الذي يظهر لك جدول العمليات النشطة حيث يمكنك أن تجد أن العملية "المنحلة"؟ أعتقد يجب أن يكون هناك طريقة للحصول على تلك المعلومات من التعليمات البرمجية ج.

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