Provided by: manpages-it_3.73-2_all 

NOME
signal - panoramica sui segnali
DESCRIZIONE
Linux supporta sia i segnali POSIX affidabili (d'ora in avanti "segnali standard") che i segnali
real-time POSIX.
Disposizioni dei segnali
Ciascun segnale ha una disposizione attuale, che determina come si comporta il processo quando il segnale
viene recapitato.
Le voci nella colonna "Azione" della tabella qui sotto specificano la disposizione predefinita di ogni
segnale, come segue:
Term L'azione predefinita è terminare il processo.
Ign L'azione predefinita è ignorare il segnale.
Core L'azione predefinita è terminare il processo ed eseguire un core dump (vedere core(5)).
Stop L'azione predefinita è arrestare il processo.
Cont L'azione predefinita è far continuare il processo se esso è attualmente fermo.
Un processo può cambiare la disposizione di un segnale usando sigaction(2) o signal(2) (l'ultimo è meno
portabile quando si crea un gestore di segnale; si veda signal(2) per i dettagli). Usando queste chiamate
di sistema, un processo può assumere uno dei seguenti comportamenti al recapito del segnale: eseguire
l'azione predefinita; ignorare il segnale; intercettare il segnale con un gestore di segnale, una
funzione definita dal programmatore che è automaticamente invocata quando il segnale è recapitato (il
gestore di segnale viene chiamato, in modo predefinito, nel normale stack del processo. È possibile fare
in modo che il gestore di segnale usi uno stack alternativo: vedere sigaltstack(2) per una discussione su
come farlo e quando può essere utile).
La disposizione del segnale è un attributo per processo: in un'applicazione multithread, la disposizione
di un particolare segnale è la stessa per tutti i thread.
Un processo figlio creato tramite fork(2) eredita una copia della disposizione dei segnali del genitore.
Durante un execve(2), la disposizione dei segnali gestiti viene inizializzata ai valori predefiniti; la
disposizione dei segnali ignorati viene lasciata com'è.
Inviare un segnale
Le seguenti chiamate di sistema e funzioni di libreria permettono al chiamante di inviare un segnale:
raise(3) Invia un segnale al thread chiamante.
kill(2) invia un segnale al processo specificato, a tutti i membri del processo di gruppo
specificato o a tutti i processi nel sistema.
killpg(2) Invia un segnale a tutti i membri del processo di gruppo specificato.
pthread_kill(3) Invia un segnale al thread POSIX specificato nello stesso processo del chiamante.
tgkill(2) Invia un segnale ad un processo specificato all'interno di un processo ben preciso (è la
chiamata di sistema usata per implementare pthread_kill(3)).
sigqueue(3) Invia un segnale real-time insieme a dati di accompagnamento al processo specificato.
Attendere che un segnale venga intercettato
Le seguenti chiamate di sistema sospendono l'esecuzione del processo chiamante o del thread finché non
viene intercettato un segnale (o finché un segnale non gestito fa terminare il processo):
pause(2) Sospende l'esecuzione finché non viene intercettato un segnale qualunque.
sigsuspend(2) Cambia temporaneamente la maschera del segnale (vedere sotto) e sospende l'esecuzione
finché viene intercettato uno dei segnali senza maschera.
Accettare in modo sincrono un segnale
Anziché intercettare un segnale in modo asincrono tramite un gestore di segnale, è possibile accettare il
segnale in modo sincrono, cioé bloccare l'esecuzione finché il segnale viene consegnato: a questo punto
il kernel restituirà informazioni sul segnale al chiamante. Ci sono in generale due modi per farlo:
* sigwaitinfo(2), sigtimedwait(2), e sigwait(3) sospendono l'esecuzione finché viene consegnato uno dei
segnali contenuti in un insieme specifico. Ognuna di queste chiamate restituisce informazioni sul
segnale consegnato.
* signalfd(2) restituisce un descrittore di file che può essere usato per leggere informazioni sui
segnali consegnati al chiamante. Ogni read(2) da questo descrittore di file blocca il chiamante finché
uno dei segnali nell'insieme specificato dalla chiamata signalfd(2) viene consegnato al chiamante
stesso. Il buffer restituito da read(2) contiene una struttura che descrive il segnale.
Maschera segnale e segnali pendenti
Un segnale può essere bloccato, cioé non verrà recapitato fino a quando non verrà sbloccato. Un segnale
viene definito pendente nel periodo di tempo che passa tra quando è stato generato e quando è recapitato.
Ciascun thread in un processo ha una maschera segnale indipendente, che indica l'insieme di segnali che
il thread attualmente sta bloccando. Un thread può manipolare la sua maschera segnale usando
pthread_sigmask(3). In un'applicazione tradizionale a thread singolo, si può usare sigprocmask(2) per
manipolare la maschera segnale.
Un processo figlio creato tramite fork(2) eredita una copia della maschera di segnale del processo
genitore: la maschera di segnale viene preservata attraverso execve(2).
Un segnale può essere generato (e quindi pendente) per un processo nel suo insieme (per esempio quando è
inviato usando kill(2)) o per uno specifico thread (per esempio certi segnali, come SIGSEGV e SIGFPE,
generati come conseguenza dell'esecuzione di una istruzione specifica in linguaggio macchina sono diretti
al thread, come lo sono i segnali indirizzati a uno specifico thread usando pthread_kill(3)). Un segnale
diretto al processo può essere recapitato a uno qualunque dei thread che attualmente non hanno il segnale
bloccato. Se più di uno dei thread ha il segnale sbloccato, allora il kernel sceglie un thread arbitrario
a cui recapitare il segnale.
Un thread può ottenere l'insieme di segnali che attualmente ha pendenti usando sigpending(2). Questo
insieme consisterà nell'unione dell'insieme dei segnali diretti ai processi pendenti e l'insieme di
segnali pendenti per il thread chiamante.
L'insieme di segnali pendenti di un processo figlio creato tramite fork(2) inizialmente è vuoto:
l'insieme di segnali pendenti è preservato attraverso execve(2).
Segnali standard
Linux supporta i segnali standard elencati di seguito. Molti numeri di segnale dipendono
dall'architettura, come indicato nella colonna "Valore" (dove sono indicati tre valori, il primo è
normalmente valido per alpha e sparc, quello in mezzo per x86, arm e la maggior parte delle altre
architetture, e l'ultimo per mips (i valori per parisc non vengono mostrati; si vedano i sorgenti del
kernel Linux per la numerazione dei segnali su questa architettura). A - denota che un segnale è assente
sulla corrispondente architettura).
Prima i segnali descritti nello standard POSIX.1-1990 originale.
Segnale Valore Azione Commento
───────────────────────────────────────────────────────────────────────────────────
SIGHUP 1 Term La linea sul terminale che ha il controllo è stata
agganciata o il processo che ha il controllo è morto
SIGINT 2 Term Interrupt da tastiera
SIGQUIT 3 Core Segnale d'uscita della tastiera
SIGILL 4 Core Istruzione illegale
SIGABRT 6 Core Segnale d'abbandono di abort(3)
SIGFPE 8 Core Eccezione in virgola mobile
SIGKILL 9 Term Termina il processo
SIGSEGV 11 Core Riferimento di memoria non valido
SIGPIPE 13 Term Pipe rotta: scrittura su una pipe priva di
lettori
SIGALRM 14 Term Segnale del timer da alarm(2)
SIGTERM 15 Term Segnale di termine
SIGUSR1 30,10,16 Term Segnale 1 definito dall'utente
SIGUSR2 31,12,17 Term Segnale 2 definito dall'utente
SIGCHLD 20,17,18 Ign Figlio fermato o terminato
SIGCONT 19,18,25 Cont Continua se fermato
SIGSTOP 17,19,23 Stop Ferma il processo
SIGTSTP 18,20,24 Stop Stop digitato dal terminale
SIGTTIN 21,21,26 Stop Input da terminale per un processo sullo sfondo
SIGTTOU 22,22,27 Stop Output da terminale per un processo sullo sfondo
I segnali SIGKILL e SIGSTOP non possono essere intercettati, bloccati o ignorati.
Seguono i segnali che non sono nello standard POSIX.1-1990 ma sono descritti in SUSv2 e POSIX.1-2001.
Segnale Valore Azione Commento
─────────────────────────────────────────────────────────────────────────────
SIGBUS 10,7,10 Core Errore sul bus (accesso errato alla memoria)
SIGPOLL Term Evento suscettibile di polling (Sys V).
Sinonimo di SIGIO
SIGPROF 27,27,29 Term Timer del profiler scaduto
SIGSYS 12,31,12 Core Argomento errato alla routine (SVr4)
SIGTRAP 5 Core Trappola per trace/breakpoint
SIGURG 16,23,21 Ign Condizione urgente sul socket (4.2BSD)
SIGVTALRM 26,26,28 Term Allarme virtuale (4.2BSD)
SIGXCPU 24,24,30 Core Superato tempo limite di CPU (4.2BSD)
SIGXFSZ 25,25,31 Core Limite dimensione file superato (4.2BSD)
Fino a Linux 2.2 incluso, il comportamento predefinito per SIGSYS, SIGXCPU, SIGXFSZ, e (su architetture
diverse da SPARC e MIPS) SIGBUS era terminare il processo (senza eseguire un core dump). (In alcuni altri
sistemi UNIX l'azione predefinita per SIGXCPU e SIGXFSZ è terminare il processo senza eseguire un core
dump.) Linux 2.4 è conforme ai requisiti di POSIX.1-2001 per questi segnali, terminando il processo con
un core dump.
E ora altri vari segnali.
Segnale Valore Azione Commento
───────────────────────────────────────────────────────────────────────────────────
SIGIOT 6 Core Trappola IOT. Sinonimo di SIGABRT
SIGEMT 7,-,7 Term
SIGSTKFLT -,16,- Term Errore dello stack del coprocessore (inutilizzato)
SIGIO 23,29,22 Term I/O ora possibile (4.2 BSD)
SIGCLD -,-,18 Ign Sinonimo di SIGCHLD
SIGPWR 29,30,19 Term Mancanza di corrente (System V)
SIGINFO 29,-,- Sinonimo di SIGPWR
SIGLOST -,-,- Term Perso il lock del file (non usato)
SIGWINCH 28,28,20 Ign Dimensioni finestra cambiate (4.3BSD, Sun)
SIGUNUSED -,31,- Core Sinonimo di SIGSYS)
(Il segnale 29 è SIGINFO / SIGPWR su alpha ma SIGLOST su sparc.)
SIGEMT non è specificato in POSIX.1-2001, tuttavia appare in molti altri sistemi UNIX, dove la sua azione
predefinita è tipicamente di terminare il processo con un core dump.
SIGPWR (non specificato in POSIX.1-2001) è tipicamente ignorato in via predefinita in questi altri UNIX
dove appare.
SIGIO (non specificato in POSIX.1-2001) è ignorato in via predefinita in molti altri sistemi UNIX.
Dove definito, SIGUNUSED è sinonimo di SIGSYS sulla maggior parte delle architetture.
Segnali Real-time
Linux supporta i segnali real-time come originariamente definiti nelle estensioni real-time di POSIX.1b
(e ora incluse in POSIX.1-2001). L'intervallo di segnali real-time supportati è definito dalle macro
SIGRTMIN e SIGRTMAX. POSIX.1-2001 richiede che un'implementazione supporti almeno i segnali real-time
_POSIX_RTSIG_MAX(8) .
Il kernel Linux supporta un intervallo di 32 diversi segnali real-time, numerati da 33 a 64. Comunque,
l'implementazione di glibc POSIX dei thread usa internamente due (per NTPL) o tre (per LinuxThreads)
segnali real-time (vedere pthreads(7)), e sistema il valore di SIGRTMIN in modo adatto (a 34 o 35). Dato
che l'intervallo di segnali real-time disponibili varia a seconda dell'implementazione dei thread di
glibc (e questa variazione può avvenire al run-time in accordo con kernel e glibc disponibili), e poiché
l'intervallo dei segnali real-time varia tra i vari sistemi UNIX, i programmi non dovrebbero mai
riferirsi ai segnali real-time usando numeri prefissati. Dovrebbero invece sempre fare riferimento ai
segnali real-time usando la notazione SIGRTMIN+n, e includere controlli adatti (run-time) perché
SIGRTMIN+n non ecceda SIGRTMAX.
Diversamente dai segnali standard, i segnali real-time non hanno significati predefiniti: l'intero
insieme dei segnali real-time può essere usato per scopi definiti dall'applicazione.
L'azione predefinita per i segnali real-time non gestiti è di terminare il processo ricevente.
I segnali real-time si distinguono da quanto segue:
1. Istanze multiple di segnali real-time possono essere accodate. Viceversa, se istanze multiple di un
segnale predefinito sono consegnate mentre questo segnale è bloccato, allora viene accodata solo
un'istanza.
2. Se il segnale è inviato usando sigqueue(3), un valore di accompagnamento (che sia un intero o un
puntatore) può essere inviato con il segnale. Se il processo ricevente stabilisce un gestore per
questo segnale usando il flag SA_SIGINFO a sigaction(2) allora esso può ottenere questo dato
attraverso il campo si_value della struttura siginfo_t passata come secondo argomento al gestore.
Inoltre i campi si_pid e si_uid di questa struttura possono essere usati per ottenere PID e ID di un
utente reale del processo che invia il segnale.
3. I segnali real-time sono recapitati in un ordine garantito. I segnali real-time multipli dello stesso
tipo sono recapitati nell'ordine in cui vengono inviati. Se segnali real-time diversi sono inviati ad
un processo, essi sono consegnati partendo dal segnale con il numero più basso (cioè i segnali con i
numeri bassi hanno la priorità maggiore). Al contrario, se segnali standard multipli sono in sospeso
per un processo, essi verranno recapitati in un ordine non specificato.
Se sia i segnali predefinit che quelli real-time sono in attesa di un processo, POSIX non specifica quale
consegnare per primo. Linux, come molte altre implementazioni, in questo caso dà priorità ai segnali
predefiniti.
Conformemente a POSIX, un'implementazione deve permettere che almeno (32) segnali real-time
_POSIX_SIGQUEUE_MAX vengano accodati a un processo. Tuttavia Linux fa le cose diversamente. Nei kernel
fino a e incluso il 2.6.7, Linux impone un limite globale al numero di segnali real-time accodati per
tutti i processi. Questo limite può essere visto e cambiato (con privilegi) attraverso il file
/proc/sys/kernel/rtsig-max. Un file correlato, /proc/sys/kernel/rtsig-nr, può essere usato per trovare
quanti segnali real-time sono attualmente accodati. In Linux 2.6.8, queste interfacce /proc sono
sostituite dal limite di risorsa RLIMIT_SIGPENDING che specifica un limite per utente per i segnali
accodati. Vedere setrlimit(2) per ulteriori dettagli.
Funzioni async-signal-safe
Una funzione di manipolazione dei segnali deve fare molta attenzione, poiché qualunque processo può
essere interrotto in un punto arbitrario durante l'esecuzione del programma. POSIX ha il concetto di
"funzione sicura". Se un segnale interrompe l'esecuzione di una funzione non sicura, e handler chiama una
funzione non sicura, allora il comportamento del programma non è definito.
POSIX.1-2004 (già conosciuto come POSIX.1-2001 Technical Corrigendum 2) richiede all'implementazione di
garantire che le seguenti funzioni possano essere chiamate in sicurezza in un gestore di segnali:
_Exit()
_exit()
abort()
accept()
access()
aio_error()
aio_return()
aio_suspend()
alarm()
bind()
cfgetispeed()
cfgetospeed()
cfsetispeed()
cfsetospeed()
chdir()
chmod()
chown()
clock_gettime()
close()
connect()
creat()
dup()
dup2()
execle()
execve()
fchmod()
fchown()
fcntl()
fdatasync()
fork()
fpathconf()
fstat()
fsync()
ftruncate()
getegid()
geteuid()
getgid()
getgroups()
getpeername()
getpgrp()
getpid()
getppid()
getsockname()
getsockopt()
getuid()
kill()
link()
listen()
lseek()
lstat()
mkdir()
mkfifo()
open()
pathconf()
pause()
pipe()
poll()
posix_trace_event()
pselect()
raise()
read()
readlink()
recv()
recvfrom()
recvmsg()
rename()
rmdir()
select()
sem_post()
send()
sendmsg()
sendto()
setgid()
setpgid()
setsid()
setsockopt()
setuid()
shutdown()
sigaction()
sigaddset()
sigdelset()
sigemptyset()
sigfillset()
sigismember()
signal()
sigpause()
sigpending()
sigprocmask()
sigqueue()
sigset()
sigsuspend()
sleep()
sockatmark()
socket()
socketpair()
stat()
symlink()
sysconf()
tcdrain()
tcflow()
tcflush()
tcgetattr()
tcgetpgrp()
tcsendbreak()
tcsetattr()
tcsetpgrp()
time()
timer_getoverrun()
timer_gettime()
timer_settime()
times()
umask()
uname()
unlink()
utime()
wait()
waitpid()
write()
POSIX.1-2008 rimuove fpathconf(), pathconf(), e sysconf() dall'elenco precedente, e aggiunge le seguenti
funzioni:
execl()
execv()
faccessat()
fchmodat()
fchownat()
fexecve()
fstatat()
futimens()
linkat()
mkdirat()
mkfifoat()
mknod()
mknodat()
openat()
readlinkat()
renameat()
symlinkat()
unlinkat()
utimensat()
utimes()
Interruzione delle chiamate di sistema e funzioni di libreria da parte di gestori di segnale
Se viene chiamato un gestore di segnale mentre una chiamata di sistema o una funzione di libreria sono
bloccate, può succedere:
* che la chiamata venga automaticamente riavviata dopo il ritorno del gestore di segnale; o
* che la chiamata fallisca con l'errore EINTR.
Il verificarsi di uno di questi due comportamenti dipende dall'interfaccia e dall'uso o meno del flag
SA_RESTART alla creazione del gestore di segnale (vedere sigaction(2)). I dettagli variano tra i sistemi
UNIX: seguono quelli per Linux.
Se un gestore di segnale interrompe una chiamata bloccata verso una delle seguenti interfacce, la
chiamata verrà automaticamente riavviata dopo il ritorno del gestore di segnale, se è stato usato il flag
SA_RESTART, altrimenti la chiamata fallirà con l'errore EINTR: chiamate
* read(2), readv(2), write(2), writev(2), e ioctl(2) su dispositivi "lenti". Un dispositivo è "lento"
quando le chiamate I/O possono bloccarsi per un tempo indeterminato, per esempio un terminale, una
pipe o un socket (un disco non è un dispositivo lento, stando a quanto dice la sua definizione). Se
una chiamata I/O su un dispositivo lento ha già trasferito alcuni dati al momento dell'interruzione
da parte del gestore di segnale, la chiamata restituirà uno stato di successo (di solito il numero
di byte trasferiti).
* open(2), se si può bloccare (per esempio nell'aprire un FIFO: vedere fifo(7)).
* wait(2), wait3(2), wait4(2), waitid(2), e waitpid(2).
* Interfacce socket: accept(2), connect(2), recv(2), recvfrom(2), recvmmsg(2), recvmsg(2), send(2),
sendto(2), e sendmsg(2), a meno che venga impostato un timeout sul socket (vedere sotto).
* Interfacce che bloccano i file: flock(2) e fcntl(2) F_SETLKW.
* Interfacce per messaggi POSIX in coda: mq_receive(3), mq_timedreceive(3), mq_send(3), e
mq_timedsend(3).
* futex(2) FUTEX_WAIT (a partire da Linux 2.6.22; prima falliva sempre con EINTR).
* Interfacce semaforo POSIX: sem_wait(3) e sem_timedwait(3) (a partire da Linux 2.6.22; prima falliva
sempre con EINTR).
Le seguenti interfacce non vengono mai riavviate dopo l'interruzione da parte di un gestore di segnale,
senza curarsi dell'uso di SA_RESTART; falliscono sempre con l'errore EINTR quando vengono interrotte da
un gestore di segnale:
* Interfacce socket in "input", quando è stato impostato un timeout (SO_RCVTIMEO) sul socket usando
setsockopt(2): accept(2), recv(2), recvfrom(2), recvmmsg(2) (anche con un argomento imeout non
NULLO) e recvmsg(2).
* Interfacce socket in "output", quando è stato impostato un timeout (SO_RCVTIMEO) sul socket usando
setsockopt(2): connect(2), send(2), sendto(2), e sendmsg(2).
* Interfacce usate per aspettare segnali: pause(2), sigsuspend(2), sigtimedwait(2), e sigwaitinfo(2).
* Interfacce condivise per descrittori di file epoll_wait(2), epoll_pwait(2), poll(2), ppoll(2),
select(2), e pselect(2).
* Interfacce IPV System V: msgrcv(2), msgsnd(2), semop(2), e semtimedop(2).
* Interfacce sleep: clock_nanosleep(2), nanosleep(2), e usleep(3).
* read(2) da un descrittore di file inotify(7).
* io_getevents(2).
La funzione sleep(3) non viene mai riavviata anche quando viene interrotta da un gestore, ma restituisce
uno stato di successo: il numero di secondi rimanenti.
Interruzione di chiamate di sistema e funzioni di libreria da parte di segnali di stop
Su Linux, anche in assenza di gestori di segnale alcune interfacce di blocco possono fallire con l'errore
EINTR dopo che il processo è stato fermato da un segnale di stop, e poi riavviato tramite SIGCONT. Questo
comportamento non è sanzionato da POSIX.1, e non avviene su altri sistemi.
Le interfacce Linux che si comportano in questo modo sono:
* Interfacce socket in "input", quando è stato impostato un timeout (SO_RCVTIMEO)
sul socket usando setsockopt(2): accept(2), recv(2), recvfrom(2), recvmmsg(2) (anche con un
argomento timeout non NULL), e recvmsg(2).
* Interfacce socket in "output", quando è stato impostato un timeout (SO_RCVTIMEO) sul socket usando
setsockopt(2): connect(2), send(2), sendto(2), e sendmsg(2), se è stato impostato un timeout in
invio (SO_SNDTIMEO).
* epoll_wait(2), epoll_pwait(2).
* semop(2), semtimedop(2).
* sigtimedwait(2), sigwaitinfo(2).
* read(2) da un descrittore di file inotify(7).
* Linux 2.6.21 e precedenti: futex(2) FUTEX_WAIT, sem_timedwait(3), sem_wait(3).
* Linux 2.6.8 e precedenti: msgrcv(2), msgsnd(2).
* Linux 2.4 e precedenti: nanosleep(2).
CONFORME A
POSIX.1, tranne dove indicato.
VEDERE ANCHE
kill(1), getrlimit(2), kill(2), killpg(2), restart_syscall(2), rt_sigqueueinfo(2), setitimer(2),
setrlimit(2), sgetmask(2), sigaction(2), sigaltstack(2), signal(2), signalfd(2), sigpending(2),
sigprocmask(2), sigsuspend(2), sigwaitinfo(2), abort(3), bsd_signal(3), longjmp(3), raise(3),
pthread_sigqueue(3), sigqueue(3), sigset(3), sigsetops(3), sigvec(3), sigwait(3), strsignal(3),
sysv_signal(3), core(5), proc(5), pthreads(7), sigevent(7)
COLOPHON
Questa pagina fa parte del rilascio 3.73 del progetto Linux man-pages. Una descrizione del progetto, le
istruzioni per la segnalazione degli errori, e l'ultima versione di questa pagina si trova su
http://www.kernel.org/doc/man-pages/.
La versione italiana fa parte del pacchetto man-pages-it v. 3.73, a cura di: ILDP "Italian Linux
Documentation Project" http://www.pluto.it/ildp
Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/
Segnalare eventuali errori di traduzione a ildp@pluto.it
Linux 2014-06-13 SIGNAL(7)