मैं एक लिनक्स उपयोगकर्ता के रूप में जवाब दे रहा हूँ, लेकिन यह सब खिड़कियों पर लागू होना चाहिए।
मेरे पास ऐसा ही सवाल था, इसलिए उम्मीद है कि मैं पिछले उत्तरों को जोड़ सकता हूं और अपना दो सेंट जोड़ सकता हूं।
सिग्नल और abort()
: ^C
और ^Z
बाहर निकलने से पहले अपने फ़ंक्शन को कॉल करने के लिए "अवरुद्ध" किया जा सकता है, संभवतः बाहर निकलने के साथ()। संकेत SIGQUIT
AKA ^\
और SIGKILL
जिनके पास कोई महत्वपूर्ण स्ट्रोक नहीं है, को अवरुद्ध नहीं किया जा सकता है। csignal
शीर्षलेख और सी ++ लैम्ब्डा का उपयोग करने के लिए यहां एक उदाहरण दिया गया है।
#include <iostream>
#include <csignal>
#include <cstdlib>
using namespace std;
int main()
{
//signal requires lam take an int parameter
//this parameter is equal to the signals value
auto lam =
[] (int i) { cout << "aborting" << endl; exit(0); };
//^C
signal(SIGINT, lam);
//abort()
signal(SIGABRT, lam);
//sent by "kill" command
signal(SIGTERM, lam);
//^Z
signal(SIGTSTP, lam);
while(1)
{
}
return 0;
}
बाहर निकलें: जब से मैं ऊपर मेरी उदाहरण में exit()
इस्तेमाल किया, ध्यान यहाँ लिया जाना चाहिए। यदि फ़ंक्शन चल रहा है तो एक क्लीन-अप फ़ंक्शन है जिसे केवल एक बार चलाने की आवश्यकता है, शायद एक स्थिर चर has_run
का उपयोग किया जा सकता है। या उपर्युक्त उदाहरण में, raise()
एक संकेत है कि आप अवरुद्ध नहीं कर सकते हैं। लेकिन वे कोर डंप के साथ आते हैं जो सिर्फ गंदा महसूस करते हैं। आपकी पसंद, यहाँ। एक उदाहरण है कि C++ 11 एक quick_exit
जो एक साथ at_quick_exit
जो ऊपर के रूप में ही कार्य है जोड़ा
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
//called with no parameters
auto lam = []() { cout << "at exit"; };
atexit(lam);
return 0;
}
लें टिप्पणी इस प्रकार है।लेकिन quick_exit
के साथ कोई साफ-सफाई कार्य नहीं किया जाता है। इसके विपरीत, exit
ऑब्जेक्ट विनाशकों के साथ कहा जाता है और सी धाराएं बंद होती हैं, केवल स्वचालित स्टोरेज वेरिएबल साफ़ नहीं हो जाते हैं।
स्रोत
2015-11-12 09:56:47
सभी मामलों में संभव नहीं है - कुछ सिग्नल तुरंत प्रक्रिया को नीचे लाते हैं चाहे आप उन्हें चाहते हैं या नहीं। (उदाहरण के लिए ढेर ओवरफ्लो) –
क्या ऑपरेटिंग सिस्टम? –