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

Reply via email to