सामान्यतया, मुझे नहीं लगता कि आप दुर्भाग्य से कर सकते हैं। (कुछ ऑपरेटिंग सिस्टम इसके लिए प्रदान कर सकते हैं, लेकिन मैं उन लोगों के बारे में नहीं जानता जो मुझे पता है कि यह समर्थन कर रहा है।)
संसाधन सीमा के लिए संदर्भ डॉक्टर: getrlimit
POSIX 2008 से।
उदाहरण के लिए सीपीयू की सीमा लें RLIMIT_CPU
।
- यदि प्रक्रिया नरम सीमा से अधिक हो जाती है, तो इसे भेजा जाता है a
SIGXCPU
- यदि प्रक्रिया कठिन सीमा से अधिक है, तो यह एक सादा हो जाता है
SIGKILL
यदि आप wait()
अपने कार्यक्रम पर कर सकते हैं , तो आप बता सकते हैं कि यह किसके द्वारा मारा गया था SIGXCPU
। लेकिन आप SIGKILL
बाहर से एक सादे पुराने मार से कठिन सीमा के उल्लंघन के लिए एक प्रेषण को अलग नहीं कर सकते थे । क्या अधिक है, अगर प्रोग्राम संभालता है XCPU
, तो आप इसे बाहर से भी नहीं देखेंगे।
के लिए एक ही बात है RLIMIT_FSIZE
। आप स्थिति SIGXFSZ
से देख सकते हैं wait()
अगर कार्यक्रम इसे संभाल नहीं करता है। लेकिन एक बार फ़ाइल का आकार सीमा पार हो जाने के बाद, केवल एक चीज यह होती है कि आगे I / O जो उस सीमा को फिर से परखने का प्रयास करता है EFBIG
- उसे आंतरिक रूप से प्रोग्राम द्वारा नियंत्रित किया जाएगा (या नहीं, दुर्भाग्य से)। यदि प्रोग्राम संभालता है SIGXFSZ
, तो ऊपर जैसा ही - आपको इसके बारे में पता नहीं होगा।
RLIMIT_NOFILE
? ठीक है, तुम भी एक संकेत नहीं मिलता है। open
और दोस्त सिर्फ EMFILE
कार्यक्रम में लौटते हैं । यह अन्यथा परेशान नहीं है, इसलिए यह उस स्थिति में विफल करने के लिए जिस भी तरीके से कोडित किया गया था (या नहीं) विफल होगा।
RLIMIT_STACK
? अच्छा पुराना SIGSEGV
, एक दिया जाने के लिए अन्य कारणों के स्कोर से अलग नहीं किया जा सकता है। (आपको पता चल जाएगा कि इस wait
स्थिति से क्या मारा गया था ।)
RLIMIT_AS
और RLIMIT_DATA
बस बना देंगे malloc()
और कुछ अन्य लोग विफल होने लगते हैं (या SIGSEGV
अगर लिनक्स पर स्टैक का विस्तार करने की कोशिश करते समय एएस की सीमा हिट होती है) प्राप्त करें। जब तक कार्यक्रम बहुत अच्छी तरह से लिखा नहीं जाता है, यह संभवतः उस बिंदु पर काफी अनियमित रूप से विफल हो जाएगा।
इसलिए संक्षेप में, आम तौर पर, विफलताएं या तो अन्य प्रक्रिया मृत्यु के कारणों से भिन्न नहीं होती हैं, इसलिए आप सुनिश्चित नहीं हो सकते हैं, या पूरी तरह से उस कार्यक्रम से निपट सकते हैं जिस स्थिति में यह तय करता है कि कब / कब / कैसे यह आगे बढ़ता है, न कि आप बाहर से।
सबसे अच्छा आप कर सकते हैं जहाँ तक मुझे पता है कि एक बिट कोड लिखा है जो आपके प्रोग्राम के कांटे, उस पर इंतजार करता है, और:
- पता लगाने के लिए बाहर निकलने की स्थिति की जाँच करें
SIGXCPU
और SIGXFSZ
(AFAIK, उन संकेतों को केवल संसाधन सीमा समस्याओं के लिए OS द्वारा उत्पन्न किया जाएगा)। आपकी सटीक आवश्यकताओं के आधार पर, आप यह मान सकते हैं कि संसाधन सीमा से संबंधित थे SIGKILL
और SIGSEGV
यह भी थोड़ा खिंचाव था।
getrusage(RUSAGE_CHILDREN,...)
अन्य लोगों के बारे में संकेत प्राप्त करने के लिए आप अपने कार्यान्वयन पर क्या देख सकते हैं।
ओएस-विशिष्ट सुविधाएं यहां (संभवतः ptrace
लिनक्स, या सोलारिस जैसी चीजें dtrace
), या संभवतः डिबगर-प्रकार की तकनीकों में मदद करने के लिए मौजूद हो सकती हैं , लेकिन यह आपके विशिष्ट कार्यान्वयन के लिए और भी अधिक बंधी होने वाली है।
(मैं उम्मीद कर रहा हूं कि कोई और व्यक्ति किसी ऐसी जादूई बात का जवाब देगा, जिससे मैं पूरी तरह अनजान हूं।)
malloc
लेकिन दुर्भाग्य से यह सामान्य रूप से मेमोरी समस्या को हल नहीं करता है, सामान्य तौर पर यह सिस्टम कॉल के बारे में हैbrk
(क्या मैं सही हूं?)।