Syscall BSD#46
svc · unix #46
sigaction
Installe ou interroge la disposition d'un signal : handler et flags.
Prototype
int sigaction(int signum, struct __sigaction *nsa, struct sigaction *osa);Retour: int
Arguments
| Name | Type | Dir | Description |
|---|---|---|---|
| signum | int | - | |
| nsa | struct __sigaction | - | |
| osa | struct sigaction | - |
Historique des versions
| XNU tag | macOS | # |
|---|---|---|
| xnu-1456.1.26 | macOS 10.6 Snow Leopard | 46 |
| xnu-1486.2.11 | — | 46 |
| xnu-1504.15.3 | — | 46 |
| xnu-1504.3.12 | — | 46 |
| xnu-1504.7.4 | — | 46 |
| xnu-1504.9.17 | — | 46 |
| xnu-1504.9.26 | — | 46 |
| xnu-1504.9.37 | — | 46 |
Exemples
Install SIGINT handler
#include <signal.h>
void on_int(int s) { (void)s; }
struct sigaction sa = {0};
sa.sa_handler = on_int;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
sigaction(SIGINT, &sa, NULL);Notes
La struct sigaction permet de choisir SA_SIGINFO (handler à trois arguments avec siginfo_t et ucontext_t), SA_RESTART pour relancer les syscalls interrompus, SA_ONSTACK pour s'exécuter sur la stack alternative et SA_RESETHAND pour une sémantique one-shot. Sur Darwin, le wrapper libc passe par __sigaction et le trampoline _sigtramp, sur lequel s'appuient les unwinders.
Détection
La probe DTrace syscall::sigaction:entry montre arg0 comme numéro de signal ; combiner avec copyinstr de l'adresse du handler pour la symbolication. Souvent vérifié par les profils sandbox.
API associées
killsigprocmasksigaltstacksigsuspend__sigwait