107 |
107 |
108 os::signal_raise(sig); |
108 os::signal_raise(sig); |
109 return JNI_TRUE; |
109 return JNI_TRUE; |
110 JVM_END |
110 JVM_END |
111 |
111 |
112 /* |
|
113 All the defined signal names for Linux. |
|
114 |
|
115 NOTE that not all of these names are accepted by our Java implementation |
|
116 |
|
117 Via an existing claim by the VM, sigaction restrictions, or |
|
118 the "rules of Unix" some of these names will be rejected at runtime. |
|
119 For example the VM sets up to handle USR1, sigaction returns EINVAL for |
|
120 STOP, and Linux simply doesn't allow catching of KILL. |
|
121 |
|
122 Here are the names currently accepted by a user of sun.misc.Signal with |
|
123 1.4.1 (ignoring potential interaction with use of chaining, etc): |
|
124 |
|
125 HUP, INT, TRAP, ABRT, IOT, BUS, USR2, PIPE, ALRM, TERM, STKFLT, |
|
126 CLD, CHLD, CONT, TSTP, TTIN, TTOU, URG, XCPU, XFSZ, VTALRM, PROF, |
|
127 WINCH, POLL, IO, PWR, SYS |
|
128 |
|
129 */ |
|
130 |
|
131 struct siglabel { |
|
132 const char *name; |
|
133 int number; |
|
134 }; |
|
135 |
|
136 struct siglabel siglabels[] = { |
|
137 /* derived from /usr/include/bits/signum.h on RH7.2 */ |
|
138 "HUP", SIGHUP, /* Hangup (POSIX). */ |
|
139 "INT", SIGINT, /* Interrupt (ANSI). */ |
|
140 "QUIT", SIGQUIT, /* Quit (POSIX). */ |
|
141 "ILL", SIGILL, /* Illegal instruction (ANSI). */ |
|
142 "TRAP", SIGTRAP, /* Trace trap (POSIX). */ |
|
143 "ABRT", SIGABRT, /* Abort (ANSI). */ |
|
144 "IOT", SIGIOT, /* IOT trap (4.2 BSD). */ |
|
145 "BUS", SIGBUS, /* BUS error (4.2 BSD). */ |
|
146 "FPE", SIGFPE, /* Floating-point exception (ANSI). */ |
|
147 "KILL", SIGKILL, /* Kill, unblockable (POSIX). */ |
|
148 "USR1", SIGUSR1, /* User-defined signal 1 (POSIX). */ |
|
149 "SEGV", SIGSEGV, /* Segmentation violation (ANSI). */ |
|
150 "USR2", SIGUSR2, /* User-defined signal 2 (POSIX). */ |
|
151 "PIPE", SIGPIPE, /* Broken pipe (POSIX). */ |
|
152 "ALRM", SIGALRM, /* Alarm clock (POSIX). */ |
|
153 "TERM", SIGTERM, /* Termination (ANSI). */ |
|
154 #ifdef SIGSTKFLT |
|
155 "STKFLT", SIGSTKFLT, /* Stack fault. */ |
|
156 #endif |
|
157 "CLD", SIGCLD, /* Same as SIGCHLD (System V). */ |
|
158 "CHLD", SIGCHLD, /* Child status has changed (POSIX). */ |
|
159 "CONT", SIGCONT, /* Continue (POSIX). */ |
|
160 "STOP", SIGSTOP, /* Stop, unblockable (POSIX). */ |
|
161 "TSTP", SIGTSTP, /* Keyboard stop (POSIX). */ |
|
162 "TTIN", SIGTTIN, /* Background read from tty (POSIX). */ |
|
163 "TTOU", SIGTTOU, /* Background write to tty (POSIX). */ |
|
164 "URG", SIGURG, /* Urgent condition on socket (4.2 BSD). */ |
|
165 "XCPU", SIGXCPU, /* CPU limit exceeded (4.2 BSD). */ |
|
166 "XFSZ", SIGXFSZ, /* File size limit exceeded (4.2 BSD). */ |
|
167 "DANGER", SIGDANGER, /* System crash imminent; free up some page space (AIX). */ |
|
168 "VTALRM", SIGVTALRM, /* Virtual alarm clock (4.2 BSD). */ |
|
169 "PROF", SIGPROF, /* Profiling alarm clock (4.2 BSD). */ |
|
170 "WINCH", SIGWINCH, /* Window size change (4.3 BSD, Sun). */ |
|
171 "POLL", SIGPOLL, /* Pollable event occurred (System V). */ |
|
172 "IO", SIGIO, /* I/O now possible (4.2 BSD). */ |
|
173 "PWR", SIGPWR, /* Power failure restart (System V). */ |
|
174 #ifdef SIGSYS |
|
175 "SYS", SIGSYS /* Bad system call. Only on some Linuxen! */ |
|
176 #endif |
|
177 }; |
|
178 |
|
179 JVM_ENTRY_NO_ENV(jint, JVM_FindSignal(const char *name)) |
|
180 |
|
181 /* find and return the named signal's number */ |
|
182 |
|
183 for(uint i=0; i<ARRAY_SIZE(siglabels); i++) |
|
184 if(!strcmp(name, siglabels[i].name)) |
|
185 return siglabels[i].number; |
|
186 |
|
187 return -1; |
|
188 |
|
189 JVM_END |
|
190 |
|
191 // used by os::exception_name() |
|
192 extern bool signal_name(int signo, char* buf, size_t len) { |
|
193 for(uint i = 0; i < ARRAY_SIZE(siglabels); i++) { |
|
194 if (signo == siglabels[i].number) { |
|
195 jio_snprintf(buf, len, "SIG%s", siglabels[i].name); |
|
196 return true; |
|
197 } |
|
198 } |
|
199 return false; |
|
200 } |
|