00001
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include "KjSignal.h"
00036
00037 bool KjSignal::m_bIsSigInt;
00038 bool KjSignal::m_bIsSigQuit;
00039
00040 KjSignal::KjSignal()
00041 {
00042 sigemptyset (&m_tSa.sa_mask);
00043 m_tSa.sa_flags = 0;
00044 m_bIsSigInt = false;
00045 m_bIsSigQuit = false;
00046 }
00047
00048 KjSignal::~KjSignal()
00049 {
00050 }
00051
00054 void KjSignal::CheckSignal(const int _iSignalId)
00055 {
00056 switch (_iSignalId)
00057 {
00058 case SIGABRT:
00059 cerr << "Signal Abort - Abnormal termination is initiated by the abort() function !" << endl;
00060 exit(1);
00061 break;
00062 case SIGFPE:
00063 cerr << "Signal Floating- Point Exception - zero divide or an operation resulting in overflow !" << endl;
00064 exit(1);
00065 break;
00066 case SIGKILL:
00067 cerr << "Signal Illegal Instruction - corruption in the code or to an attempt to execute data !" << endl;
00068 exit(1);
00069 break;
00070 case SIGSEGV:
00071 cerr << "Signal Segmentation Violation - Invalid access to storage: Program tries to read or write outside the memory it is allocated for it. !" << endl;
00072 exit(1);
00073 break;
00074 case SIGTERM:
00075 cerr << "Signal Terminate - Termination request sent to program !" << endl;
00076 exit(1);
00077 break;
00078 default:
00079 cerr << "Unpredictable signal !" << endl;
00080 exit(1);
00081 break;
00082 }
00083 }
00084
00087 void KjSignal::InitSignal(const int _iSignalId)
00088 {
00089 m_pFunction = signal(_iSignalId, CheckSignal);
00090 }
00091
00094 void KjSignal::SigIntHandler (const int _iSignalId)
00095 {
00096 if (_iSignalId == SIGINT)
00097 {
00098 cout << "Signal Interrupt - CTRL-c !" << endl;
00099 m_bIsSigInt = true;
00100 }
00101 }
00102
00105 void KjSignal::SigQuitHandler (const int _iSignalId)
00106 {
00107 if (_iSignalId == SIGQUIT)
00108 {
00109 cout << "Signal Interrupt - CTRL-\\" << endl;
00110 m_bIsSigQuit = true;
00111 }
00112 }
00113
00116 void KjSignal::SigChldHandler(const int _iSignalId)
00117 {
00118 int iStatus;
00119 waitpid(-1 , &iStatus, 0);
00120 }
00121
00123 void KjSignal::InitSignals()
00124 {
00125
00126 InitSignal(SIGABRT);
00127 InitSignal(SIGFPE);
00128 InitSignal(SIGKILL);
00129 InitSignal(SIGSEGV);
00130 InitSignal(SIGTERM);
00131
00132
00133 m_tSa.sa_handler = SigIntHandler;
00134 sigaction (SIGINT, &m_tSa, 0);
00135
00136 m_tSa.sa_handler = SigQuitHandler;
00137 sigaction (SIGQUIT, &m_tSa, 0);
00138
00139
00140
00141 }
00142
00143
00144
00145
00146