Used to change or retrieve the action taken by a process on receipt of a specific signal.
Arguments
eax |
67 |
ebx |
Specifies the signal and can be any valid signal except SIGKILL and SIGSTOP. |
ecx |
Pointer to a properly initialized old_sigaction structure which specifies the new action for the signal (this argument may be 0):
struc old_sigaction
{
.sa_handler: ;rd 1
.sa_sigaction rd 1
.sa_mask rd 1
.sa_flags rd 1
.sa_restorer rd 1
} |
old_sigaction members:
sa_handler
Specifies the action to be associated with ebx and may be SIG_DFL for the default action, SIG_IGN to ignore this signal, or a pointer to a signal handling function (see SA_SIGINFO below). This function receives the signal number as its only argument.
sa_mask
Gives a mask of signals which should be blocked during execution of the signal handler. In addition, the signal which triggered the handler will be blocked, unless the SA_NODEFER flag is used.
sa_flags
Specifies a set of flags which modify the behavior of the signal handling process:
SA_ONSTACK |
Call the signal handler on an alternate signal stack provided by sys_sigaltstack. If an alternate stack is not available, the default stack will be used. |
SA_RESTART |
Provide behaviour compatible with BSD signal semantics by making certain system calls restartable across signals. |
SA_NOCLDSTOP |
If ebx is SIGCHLD, do not receive notification when child processes stop (i.e., when they receive one of SIGSTOP, SIGTSTP, SIGTTIN or SIGTTOU) or resume (i.e., they receive SIGCONT). |
SA_RESETHAND |
Restore the signal action to the default state once the signal handler has been called. SA_ONESHOT is an obsolete, non-standard synonym for this flag. |
SA_NOCLDWAIT |
If ebx is SIGCHLD, do not transform children into zombies when they terminate. See also sys_waitpid. |
SA_NODEFER |
Do not prevent the signal from being received from within its own signal handler. SA_NOMASK is an obsolete, non-standard synonym for this flag. |
SA_SIGINFO |
If this flag is specified, then sa_sigaction (instead of sa_handler) specifies the signal-handling function for ebx. This function receives the signal number as its first argument, a pointer to a siginfo structure as its second argument and a pointer to a ucontext as its third argument.
siginfo defined as follows:
struc siginfo
{
.si_signo rd 1
.si_errno rd 1
.si_code rd 1
._kill: ;kill
._timer: ;timer
.__rt: ;_rt
._sigchld: ;sigchld
._sigfault: ;sigfault
._sigpoll: ;sigpoll
._pad rd 29
} |
Where kill, timer, _rt, sigchld, sigfault, and sigpoll defined as follows:
struc kill
{
._pid rd 1
._uid rd 1
}
struc timer
{
._tid rd 1
._overrun rd 1
.sival_int: ;rd 1
.sival_ptr rd 1
._sys_private rd 1
}
struc _rt
{
._pid rd 1
._uid rd 1
.sival_int: ;rd 1
.sival_ptr rd 1
}
struc sigchld
{
._pid rd 1
._uid rd 1
._status rd 1
._utime rd 1
._stime rd 1
}
struc sigfault
{
._addr rd 1
}
struc sigpoll
{
._band rd 1
._fd rd 1
}
|
ucontext defined as follows:
struc ucontext
{
.uc_flags rd 1
.uc_link rd 1
.uc_stack sigaltstack
.uc_mcontext sigcontext
.uc_sigmask sigset
}
|
Where sigaltstack, sigcontext, and sigset are defined as follows:
struc sigaltstack
{
.ss_sp rd 1
.ss_flags rd 1
.ss_size rd 1
}
struc sigset
{
.sig rd 2
}
struc sigcontext
{
.gs rw 1
.__gsh rw 1
.fs rw 1
.__fsh rw 1
.es rw 1
.__esh rw 1
.ds rw 1
.__dsh rw 1
.edi rd 1
.esi rd 1
.ebp rd 1
.esp rd 1
.ebx rd 1
.edx rd 1
.ecx rd 1
.eax rd 1
.trapno rd 1
.err rd 1
.eip rd 1
.cs rw 1
.__csh rw 1
.eflags rd 1
.esp_at_signal rd 1
.ss rw 1
.__ssh rw 1
.fpstate rd 1
.oldmask rd 1
.cr2 rd 1
}
|
|
|
sa_restorer
This element is obsolete and should not be used.
|
edx |
Pointer to an old_sigaction structure where the previous action will be saved (this argument may be 0). |
Return values
If the system call succeeds the return value is 0.
If the system call fails the return value is one of the following errno values:
-EFAULT |
ecx or edx points to memory which is not a valid part of the process address space. |
-EINVAL |
An invalid signal was specified. This will also be generated if an attempt is made to change the action for SIGKILL or SIGSTOP, which cannot be caught or ignored. |
|
Remarks
In kernels up to and including 2.6.13, specifying SA_NODEFER in sa_flags preventing not only the delivered signal from being masked during execution of the handler, but also the signals specified in sa_mask. This bug is was fixed in kernel 2.6.14.
According to POSIX, the behaviour of a process is undefined after it ignores a SIGFPE, SIGILL, or SIGSEGV signal that was not generated by kill or raise. Integer division by zero has undefined result. On some architectures it will generate a SIGFPE signal. (Also dividing the most negative integer by -1 may generate SIGFPE.) Ignoring this signal might lead to an endless loop.
POSIX.1-1990 disallowed setting the action for SIGCHLD to SIG_IGN. POSIX.1-2001 allows this possibility, so that ignoring SIGCHLD can be used to prevent the creation of zombies (see sys_wait*). Nevertheless, the historical BSD and System V behaviours for ignoring SIGCHLD differ, so that the only completely portable method of ensuring that terminated children do not become zombies is to catch the SIGCHLD signal and perform a sys_wait or similar.
It is not possible to block SIGKILL or SIGSTOP (by specifying them in sa_mask). Attempts to do so are silently ignored.
See /samples/basic/sigaction.asm for an example.
Compatibility
n/a |