00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 #include <csignal>
00036 #include <iostream>
00037 #include "exceptions.hh"
00038
00039
00040
00041
00042 SOME_ERROR some_error;
00043 INPUT_ERROR input_error;
00044 FILE_ERROR file_error;
00045 MEMORY_ERROR memory_error;
00046 UNHANDLED_CASE_ERROR unhandled_case_error;
00047 ARGUMENT_ERROR argument_error;
00048 KEYWORD_ERROR keyword_error;
00049 USAGE_ERROR usage_error;
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 void CatchSignals(void (*SigHandler)(int)){
00064 signal(SIGHUP,SigHandler);
00065 signal(SIGINT,SigHandler);
00066 signal(SIGQUIT,SigHandler);
00067 signal(SIGILL,SigHandler);
00068 signal(SIGABRT,SigHandler);
00069 signal(SIGFPE,SigHandler);
00070 signal(SIGSEGV,SigHandler);
00071 signal(SIGPIPE,SigHandler);
00072 signal(SIGALRM,SigHandler);
00073 signal(SIGTERM,SigHandler);
00074 signal(SIGBUS,SigHandler);
00075 }
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 void handle_signal(int signum)
00087 {
00088 switch (signum)
00089 {
00090 case SIGFPE:
00091 cout << "Caught SIGFPE: floating point exception, zero division, etc." << endl;
00092 cerr << "Caught SIGFPE: floating point exception, zero division, etc." << endl;
00093 break;
00094 case SIGHUP:
00095 cout << "Caught SIGHUP: Hang-up signal." << endl;
00096 cerr << "Caught SIGHUP: Hang-up signal." << endl;
00097 break;
00098 case SIGINT:
00099 cout << "Caught SIGINT: User interupt signal." << endl;
00100 cerr << "Caught SIGINT: User interupt signal." << endl;
00101 break;
00102 case SIGQUIT:
00103 cout << "Caught SIGQUIT: Quit signal." << endl;
00104 cerr << "Caught SIGQUIT: Quit signal." << endl;
00105 break;
00106 case SIGILL:
00107 cout << "Caught SIGILL: ? signal." << endl;
00108 cerr << "Caught SIGILL: ? signal." << endl;
00109 break;
00110 case SIGABRT:
00111 cout << "Caught SIGABRT: Abort signal." << endl;
00112 cerr << "Caught SIGABRT: Abort signal." << endl;
00113 break;
00114 case SIGSEGV:
00115 cout << "Caught SIGSEGV: ? signal." << endl;
00116 cerr << "Caught SIGSEGV: ? signal." << endl;
00117 break;
00118 case SIGPIPE:
00119 cout << "Caught SIGPIPE: ? signal." << endl;
00120 cerr << "Caught SIGPIPE: ? signal." << endl;
00121 break;
00122 case SIGALRM:
00123 cout << "Caught SIGALRM: Alarm signal." << endl;
00124 cerr << "Caught SIGALRM: Alarm signal." << endl;
00125 break;
00126 case SIGTERM:
00127 cout << "Caught SIGTERM: ? signal." << endl;
00128 cerr << "Caught SIGTERM: ? signal." << endl;
00129 break;
00130 case SIGBUS:
00131 cout << "Caught SIGBUS: Bus error signal?" << endl;
00132 cerr << "Caught SIGBUS: Bus error signal?" << endl;
00133 break;
00134 default:
00135 cout << "Caught an unknown signal?" << endl;
00136 cerr << "Caught an unknown signal?" << endl;
00137 }
00138 }
00139
00140
00141
00142