sys_sigaction [arch/i386/kernel/signal.c]
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