Reputation: 10068
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
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
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