giozh
giozh

Reputation: 10068

signal handler sa_sigaction arguments

i have

struct sigaction pipe_act;
pipe_act.sa_flags = SA_SIGINFO;
pipe_act.sa_sigaction = sigpipehandler
sigaction(SIGPIPE, &pipe_act, NULL);

when i've try to write the sigpipeHandler, gcc told me that it needs three args. The second args is ok, it's siginfo_t struct that containts information about signal, bue the first and the third (an int and a void variable), what are they?

Upvotes: 2

Views: 24511

Answers (2)

ninjalj
ninjalj

Reputation: 43748

The first argument is the signal number. It's needed because you may use the same handler for several different signals.

The third argument contains the context that was in use when the signal was received. Contexts may be used via the makecontext()/setcontext()/getcontext()/swapcontext() functions to implement user-space threads. The context structure also contains non-portable architecture-specific information, e.g. the value of processor registers when the signal was received. Mess with the processor state at your own risk.

Upvotes: 5

Dimitri
Dimitri

Reputation: 8290

The man of sigaction says :

 The sigaction structure is defined as something like:

       struct sigaction {
           void     (*sa_handler)(int);
           void     (*sa_sigaction)(int, siginfo_t *, void *);
           sigset_t   sa_mask;
           int        sa_flags;
           void     (*sa_restorer)(void);
       };  

   sa_handler specifies the action to be associated with signum and may be
   SIG_DFL for the default action, SIG_IGN to ignore  this  signal,  or  a
   pointer to a signal handling function.  This function receives the sig‐
   nal number as its only argument.

   If SA_SIGINFO is specified in sa_flags, then sa_sigaction  (instead  of
   sa_handler)  specifies  the  signal-handling function for signum.  This
   function receives the signal number as its first argument, a pointer to
   a  siginfo_t as its second argument and a pointer to a ucontext_t (cast
   to void *) as its third argument.


   ....
   The siginfo_t argument to sa_sigaction is a struct with  the  following
   elements:
       siginfo_t {
           int      si_signo;    /* Signal number */
           int      si_errno;    /* An errno value */
           int      si_code;     /* Signal code */
           int      si_trapno;   /* Trap number that caused
                                    hardware-generated signal
                                    (unused on most architectures) */
           pid_t    si_pid;      /* Sending process ID */
           uid_t    si_uid;      /* Real user ID of sending process */
           int      si_status;   /* Exit value or signal */
           clock_t  si_utime;    /* User time consumed */
           clock_t  si_stime;    /* System time consumed */
           sigval_t si_value;    /* Signal value */
           int      si_int;      /* POSIX.1b signal */
           void    *si_ptr;      /* POSIX.1b signal */
           int      si_overrun;  /* Timer overrun count; POSIX.1b timers */
           int      si_timerid;  /* Timer ID; POSIX.1b timers */
           void    *si_addr;     /* Memory location which caused fault */
           long     si_band;     /* Band event (was int in
                                    glibc 2.3.2 and earlier) */
           int      si_fd;       /* File descriptor */
           short    si_addr_lsb; /* Least significant bit of address
                                    (since kernel 2.6.32) */
       }

Upvotes: 11

Related Questions