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
00038 #include "blocxx/BLOCXX_config.h"
00039 #include "blocxx/SignalUtils.hpp"
00040 #include "blocxx/String.hpp"
00041 #include <algorithm>
00042
00043 #include <signal.h>
00044
00045 namespace BLOCXX_NAMESPACE
00046 {
00047 namespace SignalUtils
00048 {
00049 namespace
00050 {
00051 struct signalNameMapping
00052 {
00053 int sig;
00054 const char* name;
00055 };
00056
00057
00058
00059 bool operator <(const signalNameMapping& s1, const signalNameMapping& s2)
00060 {
00061 return s1.sig < s2.sig;
00062 }
00063 bool operator ==(const signalNameMapping& s1, const signalNameMapping& s2)
00064 {
00065 return s1.sig == s2.sig;
00066 }
00067
00068
00069
00070
00071
00072 const signalNameMapping supportedSignalMapping[] =
00073 {
00074 { SIGINT, "SIGINT" },
00075 { SIGILL, " SIGILL" },
00076 { SIGABRT, "SIGABRT" },
00077 { SIGFPE, " SIGFPE" },
00078 { SIGSEGV, "SIGSEGV" },
00079 { SIGTERM, "SIGTERM" },
00080 #ifdef BLOCXX_WIN32
00081 { SIGBREAK, "SIGBREAK" }
00082 #else
00083 { SIGHUP, "SIGHUP" },
00084 { SIGQUIT, "SIGQUIT" },
00085 { SIGKILL, "SIGKILL" },
00086 { SIGPIPE, "SIGPIPE" },
00087 { SIGALRM, "SIGALRM" },
00088 { SIGUSR1, "SIGUSR1" },
00089 { SIGUSR2, "SIGUSR2" },
00090 { SIGCHLD, "SIGCHLD" },
00091 { SIGCONT, "SIGCONT" },
00092 { SIGSTOP, "SIGSTOP" },
00093 { SIGTSTP, "SIGTSTP" },
00094 { SIGTTIN, "SIGTTIN" },
00095 { SIGTTOU, "SIGTTOU" },
00096 { SIGBUS, "SIGBUS" },
00097 #ifdef SIGPOLL
00098 { SIGPOLL, "SIGPOLL" },
00099 #endif
00100 { SIGPROF, "SIGPROF" },
00101 { SIGSYS, "SIGSYS" },
00102 { SIGTRAP, "SIGTRAP" },
00103 { SIGURG, "SIGURG" },
00104 { SIGVTALRM, "SIGVTALRM" },
00105 { SIGXCPU, "SIGXCPU" },
00106 { SIGXFSZ, "SIGXFSZ" },
00107 #ifdef SIGEMT
00108 { SIGEMT, "SIGEMT" },
00109 #endif
00110 #ifdef SIGSTKFLT
00111 { SIGSTKFLT, "SIGSTKFLT" },
00112 #endif
00113 #ifdef SIGPWR
00114 { SIGPWR, "SIGPWR" },
00115 #endif
00116 #ifdef SIGLOST
00117 { SIGLOST, "SIGLOST" },
00118 #endif
00119 { SIGWINCH, "SIGWINCH" },
00120 #ifdef SIGINFO
00121 { SIGINFO, "SIGINFO" },
00122 #endif
00123 { SIGIOT, "SIGIOT" },
00124 { SIGIO, "SIGIO" },
00125 #ifdef SIGCLD
00126 { SIGCLD, "SIGCLD" },
00127 #endif
00128 #ifdef SIGUNUSED
00129 { SIGUNUSED, "SIGUNUSED" }
00130 #endif
00131 #endif // for #ifdef BLOCXX_WIN32....#else...
00132 };
00133 }
00134
00135 const char* signalName(int sig)
00136 {
00137 signalNameMapping targetSignal = { sig, "" };
00138
00139 const signalNameMapping* begin = supportedSignalMapping;
00140 const signalNameMapping* end = begin + sizeof(supportedSignalMapping) / sizeof(*supportedSignalMapping);
00141
00142 const signalNameMapping* location = std::find(begin, end, targetSignal);
00143
00144 if( location != end )
00145 {
00146 return location->name;
00147 }
00148 return "UNKNOWN";
00149 }
00150 }
00151 }
00152
00153
00154
00155
00156