1 /* siginfo_t, sigevent and constants. Linux version. 2 Copyright (C) 1997-2002, 2003 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library; if not, write to the Free 17 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 18 02111-1307 USA. */ 19 20 #if !defined _SIGNAL_H && !defined __need_siginfo_t \ 21 && !defined __need_sigevent_t 22 # error "Never include this file directly. Use <signal.h> instead" 23 #endif 24 25 #include <bits/wordsize.h> 26 27 #if (!defined __have_sigval_t \ 28 && (defined _SIGNAL_H || defined __need_siginfo_t \ 29 || defined __need_sigevent_t)) 30 # define __have_sigval_t 1 31 32 /* Type for data associated with a signal. */ 33 typedef union sigval 34 { 35 int sival_int; 36 void *sival_ptr; 37 } sigval_t; 38 #endif 39 40 #if (!defined __have_siginfo_t \ 41 && (defined _SIGNAL_H || defined __need_siginfo_t)) 42 # define __have_siginfo_t 1 43 44 # define __SI_MAX_SIZE 128 45 # if __WORDSIZE == 64 46 # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4) 47 # else 48 # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3) 49 # endif 50 51 typedef struct siginfo 52 { 53 int si_signo; /* Signal number. */ 54 int si_errno; /* If non-zero, an errno value associated with 55 this signal, as defined in <errno.h>. */ 56 int si_code; /* Signal code. */ 57 58 union 59 { 60 int _pad[__SI_PAD_SIZE]; 61 62 /* kill(). */ 63 struct 64 { 65 __pid_t si_pid; /* Sending process ID. */ 66 __uid_t si_uid; /* Real user ID of sending process. */ 67 } _kill; 68 69 /* POSIX.1b timers. */ 70 struct 71 { 72 int si_tid; /* Timer ID. */ 73 int si_overrun; /* Overrun count. */ 74 sigval_t si_sigval; /* Signal value. */ 75 } _timer; 76 77 /* POSIX.1b signals. */ 78 struct 79 { 80 __pid_t si_pid; /* Sending process ID. */ 81 __uid_t si_uid; /* Real user ID of sending process. */ 82 sigval_t si_sigval; /* Signal value. */ 83 } _rt; 84 85 /* SIGCHLD. */ 86 struct 87 { 88 __pid_t si_pid; /* Which child. */ 89 __uid_t si_uid; /* Real user ID of sending process. */ 90 int si_status; /* Exit value or signal. */ 91 __clock_t si_utime; 92 __clock_t si_stime; 93 } _sigchld; 94 95 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */ 96 struct 97 { 98 void *si_addr; /* Faulting insn/memory ref. */ 99 } _sigfault; 100 101 /* SIGPOLL. */ 102 struct 103 { 104 long int si_band; /* Band event for SIGPOLL. */ 105 int si_fd; 106 } _sigpoll; 107 } _sifields; 108 } siginfo_t; 109 110 111 /* X/Open requires some more fields with fixed names. */ 112 # define si_pid _sifields._kill.si_pid 113 # define si_uid _sifields._kill.si_uid 114 # define si_timerid _sifields._timer.si_tid 115 # define si_overrun _sifields._timer.si_overrun 116 # define si_status _sifields._sigchld.si_status 117 # define si_utime _sifields._sigchld.si_utime 118 # define si_stime _sifields._sigchld.si_stime 119 # define si_value _sifields._rt.si_sigval 120 # define si_int _sifields._rt.si_sigval.sival_int 121 # define si_ptr _sifields._rt.si_sigval.sival_ptr 122 # define si_addr _sifields._sigfault.si_addr 123 # define si_band _sifields._sigpoll.si_band 124 # define si_fd _sifields._sigpoll.si_fd 125 126 127 /* Values for `si_code'. Positive values are reserved for kernel-generated 128 signals. */ 129 enum 130 { 131 SI_ASYNCNL = -60, /* Sent by asynch name lookup completion. */ 132 # define SI_ASYNCNL SI_ASYNCNL 133 SI_TKILL = -6, /* Sent by tkill. */ 134 # define SI_TKILL SI_TKILL 135 SI_SIGIO, /* Sent by queued SIGIO. */ 136 # define SI_SIGIO SI_SIGIO 137 SI_ASYNCIO, /* Sent by AIO completion. */ 138 # define SI_ASYNCIO SI_ASYNCIO 139 SI_MESGQ, /* Sent by real time mesq state change. */ 140 # define SI_MESGQ SI_MESGQ 141 SI_TIMER, /* Sent by timer expiration. */ 142 # define SI_TIMER SI_TIMER 143 SI_QUEUE, /* Sent by sigqueue. */ 144 # define SI_QUEUE SI_QUEUE 145 SI_USER, /* Sent by kill, sigsend, raise. */ 146 # define SI_USER SI_USER 147 SI_KERNEL = 0x80 /* Send by kernel. */ 148 #define SI_KERNEL SI_KERNEL 149 }; 150 151 152 /* `si_code' values for SIGILL signal. */ 153 enum 154 { 155 ILL_ILLOPC = 1, /* Illegal opcode. */ 156 # define ILL_ILLOPC ILL_ILLOPC 157 ILL_ILLOPN, /* Illegal operand. */ 158 # define ILL_ILLOPN ILL_ILLOPN 159 ILL_ILLADR, /* Illegal addressing mode. */ 160 # define ILL_ILLADR ILL_ILLADR 161 ILL_ILLTRP, /* Illegal trap. */ 162 # define ILL_ILLTRP ILL_ILLTRP 163 ILL_PRVOPC, /* Privileged opcode. */ 164 # define ILL_PRVOPC ILL_PRVOPC 165 ILL_PRVREG, /* Privileged register. */ 166 # define ILL_PRVREG ILL_PRVREG 167 ILL_COPROC, /* Coprocessor error. */ 168 # define ILL_COPROC ILL_COPROC 169 ILL_BADSTK /* Internal stack error. */ 170 # define ILL_BADSTK ILL_BADSTK 171 }; 172 173 /* `si_code' values for SIGFPE signal. */ 174 enum 175 { 176 FPE_INTDIV = 1, /* Integer divide by zero. */ 177 # define FPE_INTDIV FPE_INTDIV 178 FPE_INTOVF, /* Integer overflow. */ 179 # define FPE_INTOVF FPE_INTOVF 180 FPE_FLTDIV, /* Floating point divide by zero. */ 181 # define FPE_FLTDIV FPE_FLTDIV 182 FPE_FLTOVF, /* Floating point overflow. */ 183 # define FPE_FLTOVF FPE_FLTOVF 184 FPE_FLTUND, /* Floating point underflow. */ 185 # define FPE_FLTUND FPE_FLTUND 186 FPE_FLTRES, /* Floating point inexact result. */ 187 # define FPE_FLTRES FPE_FLTRES 188 FPE_FLTINV, /* Floating point invalid operation. */ 189 # define FPE_FLTINV FPE_FLTINV 190 FPE_FLTSUB /* Subscript out of range. */ 191 # define FPE_FLTSUB FPE_FLTSUB 192 }; 193 194 /* `si_code' values for SIGSEGV signal. */ 195 enum 196 { 197 SEGV_MAPERR = 1, /* Address not mapped to object. */ 198 # define SEGV_MAPERR SEGV_MAPERR 199 SEGV_ACCERR /* Invalid permissions for mapped object. */ 200 # define SEGV_ACCERR SEGV_ACCERR 201 }; 202 203 /* `si_code' values for SIGBUS signal. */ 204 enum 205 { 206 BUS_ADRALN = 1, /* Invalid address alignment. */ 207 # define BUS_ADRALN BUS_ADRALN 208 BUS_ADRERR, /* Non-existant physical address. */ 209 # define BUS_ADRERR BUS_ADRERR 210 BUS_OBJERR /* Object specific hardware error. */ 211 # define BUS_OBJERR BUS_OBJERR 212 }; 213 214 /* `si_code' values for SIGTRAP signal. */ 215 enum 216 { 217 TRAP_BRKPT = 1, /* Process breakpoint. */ 218 # define TRAP_BRKPT TRAP_BRKPT 219 TRAP_TRACE /* Process trace trap. */ 220 # define TRAP_TRACE TRAP_TRACE 221 }; 222 223 /* `si_code' values for SIGCHLD signal. */ 224 enum 225 { 226 CLD_EXITED = 1, /* Child has exited. */ 227 # define CLD_EXITED CLD_EXITED 228 CLD_KILLED, /* Child was killed. */ 229 # define CLD_KILLED CLD_KILLED 230 CLD_DUMPED, /* Child terminated abnormally. */ 231 # define CLD_DUMPED CLD_DUMPED 232 CLD_TRAPPED, /* Traced child has trapped. */ 233 # define CLD_TRAPPED CLD_TRAPPED 234 CLD_STOPPED, /* Child has stopped. */ 235 # define CLD_STOPPED CLD_STOPPED 236 CLD_CONTINUED /* Stopped child has continued. */ 237 # define CLD_CONTINUED CLD_CONTINUED 238 }; 239 240 /* `si_code' values for SIGPOLL signal. */ 241 enum 242 { 243 POLL_IN = 1, /* Data input available. */ 244 # define POLL_IN POLL_IN 245 POLL_OUT, /* Output buffers available. */ 246 # define POLL_OUT POLL_OUT 247 POLL_MSG, /* Input message available. */ 248 # define POLL_MSG POLL_MSG 249 POLL_ERR, /* I/O error. */ 250 # define POLL_ERR POLL_ERR 251 POLL_PRI, /* High priority input available. */ 252 # define POLL_PRI POLL_PRI 253 POLL_HUP /* Device disconnected. */ 254 # define POLL_HUP POLL_HUP 255 }; 256 257 # undef __need_siginfo_t 258 #endif /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t). */ 259 260 261 #if (defined _SIGNAL_H || defined __need_sigevent_t) \ 262 && !defined __have_sigevent_t 263 # define __have_sigevent_t 1 264 265 /* Structure to transport application-defined values with signals. */ 266 # define __SIGEV_MAX_SIZE 64 267 # if __WORDSIZE == 64 268 # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4) 269 # else 270 # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) 271 # endif 272 273 typedef struct sigevent 274 { 275 sigval_t sigev_value; 276 int sigev_signo; 277 int sigev_notify; 278 279 union 280 { 281 int _pad[__SIGEV_PAD_SIZE]; 282 283 /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the 284 thread to receive the signal. */ 285 __pid_t _tid; 286 287 struct 288 { 289 void (*_function) (sigval_t); /* Function to start. */ 290 void *_attribute; /* Really pthread_attr_t. */ 291 } _sigev_thread; 292 } _sigev_un; 293 } sigevent_t; 294 295 /* POSIX names to access some of the members. */ 296 # define sigev_notify_function _sigev_un._sigev_thread._function 297 # define sigev_notify_attributes _sigev_un._sigev_thread._attribute 298 299 /* `sigev_notify' values. */ 300 enum 301 { 302 SIGEV_SIGNAL = 0, /* Notify via signal. */ 303 # define SIGEV_SIGNAL SIGEV_SIGNAL 304 SIGEV_NONE, /* Other notification: meaningless. */ 305 # define SIGEV_NONE SIGEV_NONE 306 SIGEV_THREAD, /* Deliver via thread creation. */ 307 # define SIGEV_THREAD SIGEV_THREAD 308 309 SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ 310 #define SIGEV_THREAD_ID SIGEV_THREAD_ID 311 }; 312 313 #endif /* have _SIGNAL_H. */ 314