1 /* 2 * Copyright (c) 1982, 1986, 1989, 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * (c) UNIX System Laboratories, Inc. 5 * All or some portions of this file are derived from material licensed 6 * to the University of California by American Telephone and Telegraph 7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with 8 * the permission of UNIX System Laboratories, Inc. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * 34 * @(#)signal.h 8.4 (Berkeley) 5/4/95 35 * $FreeBSD: src/sys/sys/signal.h,v 1.23.2.2 2001/04/19 01:38:35 alfred Exp $ 36 */ 37 38 #ifndef _SYS_SIGNAL_H_ 39 #define _SYS_SIGNAL_H_ 40 41 #include <sys/cdefs.h> 42 #include <sys/_siginfo.h> 43 #include <sys/_sigset.h> 44 #include <machine/stdint.h> 45 46 #ifndef _PID_T_DECLARED 47 typedef __pid_t pid_t; 48 #define _PID_T_DECLARED 49 #endif 50 51 #ifndef _SIZE_T_DECLARED 52 typedef __size_t size_t; 53 #define _SIZE_T_DECLARED 54 #endif 55 56 #ifndef _UID_T_DECLARED 57 typedef __uint32_t uid_t; 58 #define _UID_T_DECLARED 59 #endif 60 61 /* 62 * sigset_t macros. 63 */ 64 #define _SIG_MAXSIG 128 65 #define _SIG_IDX(sig) ((sig) - 1) 66 #define _SIG_WORD(sig) (_SIG_IDX(sig) >> 5) 67 #define _SIG_BIT(sig) (1 << (_SIG_IDX(sig) & 31)) 68 #define _SIG_VALID(sig) ((sig) < _SIG_MAXSIG && (sig) > 0) 69 70 /* 71 * System defined signals. 72 */ 73 #if __POSIX_VISIBLE 74 #define SIGHUP 1 /* hangup */ 75 #endif 76 #define SIGINT 2 /* interrupt */ 77 #if __POSIX_VISIBLE 78 #define SIGQUIT 3 /* quit */ 79 #endif 80 #define SIGILL 4 /* illegal instr. (not reset when caught) */ 81 #if __XSI_VISIBLE 82 #define SIGTRAP 5 /* trace trap (not reset when caught) */ 83 #endif 84 #define SIGABRT 6 /* abort() */ 85 #if __BSD_VISIBLE 86 #define SIGIOT SIGABRT /* compatibility */ 87 #define SIGEMT 7 /* EMT instruction */ 88 #endif 89 #define SIGFPE 8 /* floating point exception */ 90 #if __POSIX_VISIBLE 91 #define SIGKILL 9 /* kill (cannot be caught or ignored) */ 92 #endif 93 #if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE 94 #define SIGBUS 10 /* bus error */ 95 #endif 96 #define SIGSEGV 11 /* segmentation violation */ 97 #if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE 98 #define SIGSYS 12 /* non-existent system call invoked */ 99 #endif 100 #if __POSIX_VISIBLE 101 #define SIGPIPE 13 /* write on a pipe with no one to read it */ 102 #define SIGALRM 14 /* alarm clock */ 103 #endif 104 #define SIGTERM 15 /* software termination signal from kill */ 105 #if __POSIX_VISIBLE >= 200112 || __XSI_VISIBLE 106 #define SIGURG 16 /* urgent condition on IO channel */ 107 #endif 108 #if __POSIX_VISIBLE 109 #define SIGSTOP 17 /* sendable stop signal not from tty */ 110 #define SIGTSTP 18 /* stop signal from tty */ 111 #define SIGCONT 19 /* continue a stopped process */ 112 #define SIGCHLD 20 /* to parent on child stop or exit */ 113 #define SIGTTIN 21 /* to readers pgrp upon background tty read */ 114 #define SIGTTOU 22 /* like TTIN if (tp->t_local<OSTOP) */ 115 #endif 116 #if __BSD_VISIBLE 117 #define SIGIO 23 /* input/output possible signal */ 118 #endif 119 #if __XSI_VISIBLE 120 #define SIGXCPU 24 /* exceeded CPU time limit */ 121 #define SIGXFSZ 25 /* exceeded file size limit */ 122 #define SIGVTALRM 26 /* virtual time alarm */ 123 #define SIGPROF 27 /* profiling time alarm */ 124 #endif 125 #if __BSD_VISIBLE 126 #define SIGWINCH 28 /* window size changes */ 127 #define SIGINFO 29 /* information request */ 128 #endif 129 #if __POSIX_VISIBLE 130 #define SIGUSR1 30 /* user defined signal 1 */ 131 #define SIGUSR2 31 /* user defined signal 2 */ 132 #endif 133 #if __BSD_VISIBLE 134 #define SIGTHR 32 /* Thread interrupt (FreeBSD-5 reserved) */ 135 #define SIGCKPT 33 /* checkpoint and continue */ 136 #define SIGCKPTEXIT 34 /* checkpoint and exit */ 137 #endif 138 139 /*- 140 * Type of a signal handling function. 141 * 142 * Language spec sez signal handlers take exactly one arg, even though we 143 * actually supply three. Ugh! 144 * 145 * We don't try to hide the difference by leaving out the args because 146 * that would cause warnings about conformant programs. Nonconformant 147 * programs can avoid the warnings by casting to (__sighandler_t *) or 148 * sig_t before calling signal() or assigning to sa_handler or sv_handler. 149 * 150 * The kernel should reverse the cast before calling the function. It 151 * has no way to do this, but on most machines 1-arg and 3-arg functions 152 * have the same calling protocol so there is no problem in practice. 153 * A bit in sa_flags could be used to specify the number of args. 154 * 155 * SIG_EINTR causes system calls to interrupt but generates no signal 156 * delivery. The caller is responsible for polling the event. 157 */ 158 typedef void __sighandler_t (int); 159 160 #define SIG_DFL ((__sighandler_t *)0) 161 #define SIG_IGN ((__sighandler_t *)1) 162 #define SIG_ERR ((__sighandler_t *)-1) 163 164 #if __POSIX_VISIBLE >= 199309 165 #if !defined(_KERNEL) || defined(_KERNEL_VIRTUAL) 166 #ifndef _PTHREAD_ATTR_T_DECLARED 167 struct __pthread_attr_s; 168 typedef struct __pthread_attr_s *pthread_attr_t; 169 #define _PTHREAD_ATTR_T_DECLARED 170 #endif 171 #endif 172 173 struct sigevent { 174 int sigev_notify; /* Notification type */ 175 union { 176 int __sigev_signo; /* Signal number */ 177 int __sigev_notify_kqueue; 178 #ifdef _KERNEL 179 void *__sigev_notify_attributes; 180 #else 181 pthread_attr_t *__sigev_notify_attributes; 182 #endif 183 } __sigev_u; 184 union sigval sigev_value; /* Signal value */ 185 void (*sigev_notify_function)(union sigval); 186 }; 187 #define sigev_signo __sigev_u.__sigev_signo 188 #define sigev_notify_attributes __sigev_u.__sigev_notify_attributes 189 #if __BSD_VISIBLE 190 #define sigev_notify_kqueue __sigev_u.__sigev_notify_kqueue 191 #endif 192 193 #define SIGEV_NONE 0 /* No async notification */ 194 #define SIGEV_SIGNAL 1 /* Generate a queued signal */ 195 #define SIGEV_THREAD 2 /* Call back in a pthread */ 196 #if __BSD_VISIBLE 197 #define SIGEV_KEVENT 3 /* Generate a kevent */ 198 #endif 199 #endif /* __POSIX_VISIBLE >= 199309 */ 200 201 #ifndef _SIGSET_T_DECLARED 202 typedef struct __sigset sigset_t; 203 #define _SIGSET_T_DECLARED 204 #endif 205 206 /* 207 * XXX - there are some nasty dependencies on include file order. Now that 208 * sigset_t has been defined we can include the MD header. 209 */ 210 #include <machine/signal.h> /* sig_atomic_t; trap codes; sigcontext */ 211 212 #if __POSIX_VISIBLE 213 struct __siginfo; 214 215 /* 216 * Signal vector "template" used in sigaction call. 217 */ 218 struct sigaction { 219 union { 220 void (*__sa_handler) (int); 221 void (*__sa_sigaction) (int, struct __siginfo *, void *); 222 } __sigaction_u; /* signal handler */ 223 int sa_flags; /* see signal options below */ 224 sigset_t sa_mask; /* signal mask to apply */ 225 }; 226 227 /* if SA_SIGINFO is set, sa_sigaction is to be used instead of sa_handler. */ 228 #define sa_handler __sigaction_u.__sa_handler 229 230 #define SA_NOCLDSTOP 0x0008 /* do not generate SIGCHLD on child stop */ 231 #endif /* __POSIX_VISIBLE */ 232 233 #if __XSI_VISIBLE 234 #define sa_sigaction __sigaction_u.__sa_sigaction 235 #endif 236 237 #if __XSI_VISIBLE 238 #define SA_ONSTACK 0x0001 /* take signal on signal stack */ 239 #define SA_RESTART 0x0002 /* restart system call on signal return */ 240 #define SA_RESETHAND 0x0004 /* reset to SIG_DFL when taking signal */ 241 #define SA_NODEFER 0x0010 /* don't mask the signal we're delivering */ 242 #define SA_NOCLDWAIT 0x0020 /* don't keep zombies around */ 243 #define SA_SIGINFO 0x0040 /* signal handler with SA_SIGINFO args */ 244 #endif 245 246 #if __BSD_VISIBLE 247 #define NSIG 64 /* size of sigptbl */ 248 249 /* Additional FreeBSD values. */ 250 #define SI_UNDEFINED 0 251 252 typedef void __siginfohandler_t (int, siginfo_t *, void *); 253 254 #endif 255 256 /* XXX this should really be under __BSD_VISIBLE */ 257 typedef __sighandler_t *sig_t; /* type of pointer to a signal function */ 258 259 /* #if __XSI_VISIBLE */ 260 /* 261 * Structure used in sigaltstack call. 262 */ 263 #if __BSD_VISIBLE 264 typedef struct sigaltstack { 265 #else 266 typedef struct { 267 #endif 268 void *ss_sp; /* signal stack base */ 269 size_t ss_size; /* signal stack length */ 270 int ss_flags; /* SS_DISABLE and/or SS_ONSTACK */ 271 } stack_t; 272 273 #define SS_ONSTACK 0x0001 /* take signal on alternate stack */ 274 #define SS_DISABLE 0x0004 /* disable taking signals on alternate stack */ 275 #define MINSIGSTKSZ 8192 /* minimum allowable stack */ 276 #define SIGSTKSZ (MINSIGSTKSZ + 32768) /* recommended stack size */ 277 /* #endif */ 278 279 /* Have enough typedefs for this now. XXX */ 280 #include <sys/ucontext.h> 281 282 #if __BSD_VISIBLE 283 /* 284 * 4.3 compatibility: 285 * Signal vector "template" used in sigvec call. 286 */ 287 struct sigvec { 288 __sighandler_t *sv_handler; /* signal handler */ 289 int sv_mask; /* signal mask to apply */ 290 int sv_flags; /* see signal options below */ 291 }; 292 293 #define SV_ONSTACK SA_ONSTACK 294 #define SV_INTERRUPT SA_RESTART /* same bit, opposite sense */ 295 #define SV_RESETHAND SA_RESETHAND 296 #define SV_NODEFER SA_NODEFER 297 #define SV_NOCLDSTOP SA_NOCLDSTOP 298 #define SV_SIGINFO SA_SIGINFO 299 #define sv_onstack sv_flags /* isn't compatibility wonderful! */ 300 #endif 301 302 #if __BSD_VISIBLE || (__POSIX_VISIBLE && __POSIX_VISIBLE < 200809) 303 /* 304 * Macro for converting signal number to a mask suitable for 305 * sigblock(). 306 */ 307 #define sigmask(m) (1 << ((m)-1)) 308 #endif 309 310 #if __BSD_VISIBLE 311 #define BADSIG SIG_ERR 312 #endif 313 314 #if __POSIX_VISIBLE 315 /* 316 * Flags for sigprocmask: 317 */ 318 #define SIG_BLOCK 1 /* block specified signal set */ 319 #define SIG_UNBLOCK 2 /* unblock specified signal set */ 320 #define SIG_SETMASK 3 /* set specified signal set */ 321 #endif 322 323 /* 324 * For historical reasons; programs expect signal's return value to be 325 * defined by <sys/signal.h>. 326 */ 327 __BEGIN_DECLS 328 __sighandler_t *signal(int, __sighandler_t *); 329 #if __BSD_VISIBLE 330 int sigblockall(void); 331 int sigunblockall(void); 332 #endif 333 __END_DECLS 334 335 #endif /* !_SYS_SIGNAL_H_ */ 336