Go to main content

man pages section 3: Library Interfaces and Headers

Exit Print View

Updated: July 2017
 
 

siginfo(3HEAD)

Name

siginfo.h, siginfo - signal generation information

Synopsis

#include <siginfo.h> 

Description

If a process is catching a signal, it might request information that tells why the system generated that signal. See sigaction(2). If a process is monitoring its children, it might receive information that tells why a child changed state. See waitid(2). In either case, the system returns the information in a structure of type siginfo_t , which includes the following information:

int            si_signo        /* signal number */
int            si_errno        /* error number */
int            si_code         /* signal code */
union sigval   si_value        /* signal value */

si_signo contains the system-generated signal number. For the waitid(2) function, si_signo is always SIGCHLD.

If si_errno is non-zero, it contains an error number associated with this signal, as defined in <errno.h> .

si_code contains a code identifying the cause of the signal.

If the value of the si_code member is SI_NOINFO, only the si_signo member of siginfo_t is meaningful, and the value of all other members is unspecified.

User Signals

If the value of si_code is less than or equal to 0, then the signal was generated by a user process (see kill(2), _lwp_kill(2), sigqueue(3C), sigsend(2), abort(3C), and raise(3C)) and the siginfo structure contains the following additional information:

pid_t        si_pid      /* sending process ID */
uid_t        si_uid      /* sending user ID */
ctid_t       si_ctid     /* sending contract ID */
zoneid_t     si_zoneid   /* sending zone ID */S

If the signal was generated by a user process, the following values are defined for si_code:

SI_USER

The implementation sets si_code to SI_USER if the signal was sent by kill(2), sigsend(2), raise(3C) or abort(3C).

SI_LWP

The signal was sent by _lwp_kill(2).

SI_QUEUE

The signal was sent by sigqueue(3C).

SI_TIMER

The signal was generated by the expiration of a timer created by timer_settime(3C).

SI_ASYNCIO

The signal was generated by the completion of an asynchronous I/O request.

SI_MESGQ

The signal was generated by the arrival of a message on an empty message queue. See mq_notify(3C).

si_value contains the application specified value, which is passed to the application's signal-catching function at the time of the signal delivery if si_code is any of SI_QUEUE, SI_TIMER, SI_ASYNCHIO, or SI_MESGQ.

System Signals

Non-user generated signals can arise for a number of reasons. For all of these cases, si_code contains a positive value reflecting the reason why the system generated the signal:

Signal
Code
Reason
SIGILL
ILL_ILLOPC
illegal opcode
ILL_ILLOPN
illegal operand
ILL_ILLADR
illegal addressing mode
ILL_ILLTRP
illegal trap
ILL_PRVOPC
privileged opcode
ILL_PRVREG
privileged register
ILL_COPROC
co-processor error
ILL_BADSTK
internal stack error
SIGFPE
FPE_INTDIV
integer divide by zero
FPE_INTOVF
integer overflow
FPE_FLTDIV
floating point divide by zero
FPE_FLTOVF
floating point overflow
FPE_FLTUND
floating point underflow
FPE_FLTRES
floating point inexact result
FPE_FLTINV
invalid floating point operation
FPE_FLTSUB
subscript out of range
SIGSEGV
SEGV_MAPERR
address not mapped to object
SEGV_ACCERR
invalid permissions for mapped object
SEGV_ACCADI
ADI not enabled for mapped object
SEGV_ADIDERR
ADI mismatch exception disrupting
SEGV_ADIPERR
ADI mismatch exception precise
SEGV_CMI
exception in mapped CMI object
SIGBUS
BUS_ADRALN
invalid address alignment
BUS_ADRERR
non-existent physical address
BUS_OBJERR
object specific hardware error
BUS_MEM_UE
user process uncorrectable memory error
SIGTRAP
TRAP_BRKPT
process breakpoint
TRAP_TRACE
process trace trap
SIGCHLD
CLD_EXITED
child has exited
CLD_KILLED
child was killed
CLD_DUMPED
child terminated abnormally
CLD_TRAPPED
traced child has trapped
CLD_STOPPED
child has stopped
CLD_CONTINUED
stopped child had continued
SIGPOLL
POLL_IN
data input available
POLL_OUT
output buffers available
POLL_MSG
input message available
POLL_ERR
I/O error
POLL_PRI
high priority input available
POLL_HUP
device disconnected

Signals can also be generated from the resource control subsystem. Where these signals do not already possess kernel-level siginfo codes, the siginfo si_code will be filled with SI_RCTL to indicate a kernel-generated signal from an established resource control value.

Signal
Code
Reason
SIGXRES
SI_RCTL
resource–control generated signal
SIGHUP
SIGTERM

The uncatchable signals SIGSTOP and SIGKILL have undefined siginfo codes.

Signals sent with a siginfo code of SI_RCTL contain code-dependent information for kernel-generated signals:

Code
Field
Value
SI_RCTL
hr_time si_entity
process-model entity of control

In addition, the following signal-dependent information is available for kernel-generated signals:

Signal
Field
Value
SIGILL
caddr_t si_addr
address of faulting instruction
SIGFPE
SIGSEGV
caddr_t si_addr
address of faulting memory reference
SIGBUS
SIGCHLD
pid_t si_pid
child process ID
int si_status
exit value or signal
SIGPOLL
long si_band
band event for POLL_IN, POLL_OUT, or POLL_MSG

Signals sent with a siginfo code of SEGV_ADIPERR or SEGV_ADIDERR contain signal-dependent information for kernel-generated SIGSEGV signals:

Code
Field
Value
SEGV_ADIPERR
caddr_t si_addr
address of mismatched memory reference
caddr_t si_pc
address of instruction that executed mismatched memory reference
int si_adivers
current ADI version of si_addr
SEGV_ADIDERR
caddr_t si_addr
instruction address of first store where mismatch was detected
caddr_t si_pc
-1
int si_adivers
-1

Signals sent with a siginfo code of SEGV_CMI contain signal-dependent + information for kernel-generated SIGSEGV signals:

Code
Field
Value
SEGV_CMI
int si_trapno
CMI segment id of the mapped CMI + object that contains si_addr

See Also

_lwp_kill(2), adi_version_max(2), kill(2), setrctl(2), sigaction(2), sigsend(2), waitid(2), abort(3C), aio_read(3C), mq_notify(3C), raise(3C), sigqueue(3C), timer_create(3C), timer_settime(3C), signal.h(3HEAD)

Notes

For SIGCHLD signals, if si_code is equal to CLD_EXITED, then si_status is equal to the exit value of the process; otherwise, it is equal to the signal that caused the process to change state. For some implementations, the exact value of si_addr might not be available; in that case, si_addr is guaranteed to be on the same page as the faulting instruction or memory reference.

For SIGSEGV signals with si_code equal to SEGV_ADIPERR, the value of si_adivers will be the in-memory version of the mismatched address at the time that the kernel fetches it during the processing of the trap, not the version at the time of the trap. If a thread other than the one that executed the data access and took the trap changes the version between the time of the trap and the kernel access, si_adivers will contain that new value.

For SIGSEGV signals with si_code equal to SEGV_ADIPERR, if the in-memory version is lost due to a hardware error which cannot be corrected, or if the in-memory version is greater than the value returned by the adi_version_max(2) function, si_adivers will be set to -1.

A SIGSEGV signal with si_code equal to SEGV_ADIPERR results from an ADI exception that generates a precise trap, while a SIGSEGV signal with si_code equal to SEGV_ADIDERR results from an ADI exception that generates a disrupting trap. When si_code is equal to SEGV_ADIDERR, si_pc is -1 because the PC (program counter) where the disrupting trap occurred is not related to the store that caused the trap. si_adivers is -1 because the store address that caused the trap is not provided by the hardware. There is no reliable way for software to determine the address since an unpredictable number of instructions are executed after the store and before the trap is taken due to the nature of a disrupting trap.