Technically, it doesn't match. The #defines after provide matching labels for symbolic references, so portable source most likely will compile, but using a field not listed for an si_code value (with an intent of temporary storage, perhaps, rather than increase the frame size for automatic variables) risks overwriting values that are pertinent to that code, or reading invalid values. The method can save space for packed allocations, usually "a good thing", at the expense of precluding some forms of algorithm optimizations.
On Monday, November 14, 2016 FELLIN, JEFF K (JEFF) (JEFF) <j...@research.att.com> wrote: As I read this information from signal.h : [CX] The <signal.h> header shall define the siginfo_t type as a structure, which shall include at least the following members: [CX] int si_signo Signal number. int si_code Signal code. [XSI] int si_errno If non-zero, an errno value associated with this signal, as described in <errno.h>. [CX] pid_t si_pid Sending process ID. uid_t si_uid Real user ID of sending process. void *si_addr Address of faulting instruction. int si_status Exit value or signal. [OB XSR] long si_band Band event for SIGPOLL. [CX] union sigval si_value Signal value. All of the above members MUST be available in all occurrences of siginfo_t, whether or not they are applicable on a specific signal. So can someone tell me how this siginfo_t definition matches the minimum set of members for ALL instances of siginfo_t? typedef struct siginfo { int si_signo; /* Signal number. */ int si_errno; /* If non-zero, an errno value associated with this signal, as defined in <errno.h>. */ int si_code; /* Signal code. */ union { int _pad[__SI_PAD_SIZE]; /* kill(). */ struct { __pid_t si_pid; /* Sending process ID. */ __uid_t si_uid; /* Real user ID of sending process. */ } _kill; /* POSIX.1b timers. */ struct { int si_tid; /* Timer ID. */ int si_overrun; /* Overrun count. */ sigval_t si_sigval; /* Signal value. */ } _timer; /* POSIX.1b signals. */ struct { __pid_t si_pid; /* Sending process ID. */ __uid_t si_uid; /* Real user ID of sending process. */ sigval_t si_sigval; /* Signal value. */ } _rt; /* SIGCHLD. */ struct { __pid_t si_pid; /* Which child. */ __uid_t si_uid; /* Real user ID of sending process. */ int si_status; /* Exit value or signal. */ __clock_t si_utime; __clock_t si_stime; } _sigchld; /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */ struct { void *si_addr; /* Faulting insn/memory ref. */ } _sigfault; /* SIGPOLL. */ struct { long int si_band; /* Band event for SIGPOLL. */ int si_fd; } _sigpoll; } _sifields; } siginfo_t; /* X/Open requires some more fields with fixed names. */ # define si_pid _sifields._kill.si_pid # define si_uid _sifields._kill.si_uid # define si_timerid _sifields._timer.si_tid # define si_overrun _sifields._timer.si_overrun # define si_status _sifields._sigchld.si_status # define si_utime _sifields._sigchld.si_utime # define si_stime _sifields._sigchld.si_stime # define si_value _sifields._rt.si_sigval # define si_int _sifields._rt.si_sigval.sival_int # define si_ptr _sifields._rt.si_sigval.sival_ptr # define si_addr _sifields._sigfault.si_addr # define si_band _sifields._sigpoll.si_band # define si_fd _sifields._sigpoll.si_fd Jeff Fellin