[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico] [volume] [parte]


Capitolo 92.   Invio di segnali ai processi

I segnali sono dei numeri ai quali i programmi attribuiscono significati determinati, relativi a quanto accade nel sistema. I segnali rappresentano sia un'informazione che un ordine: nella maggior parte dei casi i programmi possono intercettare i segnali e compiere delle operazioni correlate prima di adeguarsi al nuovo stato, oppure addirittura rifiutare gli ordini; in altri casi sono sottomessi immediatamente agli ordini.

La tabella seguente riassume i segnali descritti dallo standard POSIX.1, mentre l'elenco completo può essere ottenuto consultando la pagina di manuale signal(7).

Tabella 92.1. Segnali secondo lo standard POSIX.1.

Segnale Descrizione
SIGHUP Il collegamento con il terminale è stato interrotto.
SIGINT Interruzione attraverso un comando dalla tastiera.
SIGQUIT Conclusione attraverso un comando dalla tastiera.
SIGILL Istruzione non valida.
SIGABRT Interruzioni di sistema.
SIGFPE Eccezione in virgola mobile.
SIGKILL Conclusione immediata.
SIGSEGV Riferimento non valido a un segmento di memoria.
SIGPIPE Condotto interrotto.
SIGALRM Timer.
SIGTERM Conclusione.
SIGUSR1 Primo segnale definibile dall'utente.
SIGUSR2 Secondo segnale definibile dall'utente.
SIGCHLD Eliminazione di un processo figlio.
SIGCONT Riprende l'esecuzione se in precedenza è stato fermato.
SIGTSTOP Ferma immediatamente il processo.
SIGTSTP Stop attraverso un comando della tastiera.
SIGTTIN Processo sullo sfondo che richiede dell'input.
SIGTTOU Processo sullo sfondo che deve emettere dell'output.

I numeri dei segnali sono stati abbinati a nomi standard che ne rappresentano in breve il significato (in forma di abbreviazione o di acronimo). I numeri dei segnali non sono standard tra i vari sistemi Unix e dipendono dal tipo di architettura hardware utilizzata. Anche all'interno di GNU/Linux stesso ci possono essere differenze a seconda del tipo di macchina che si utilizza.

Questo particolare è importante sia per giustificare il motivo per cui è opportuno fare riferimento ai segnali in forma verbale, sia per ricordare la necessità di fare attenzione con i programmi che richiedono l'indicazione di segnali esclusivamente in forma numerica (per esempio top).

92.1   Segnali attraverso la tastiera

Alcuni segnali possono essere inviati al programma con il quale si interagisce attraverso delle combinazioni di tasti. Di solito si invia un segnale SIGINT attraverso la combinazione [Ctrl c], un segnale SIGTSTP attraverso la combinazione [Ctrl z] e un segnale SIGQUIT attraverso la combinazione [Ctrl \].

L'effetto di queste combinazioni di tasti dipende dalla configurazione della linea di terminale. Questa può essere controllata o modificata attraverso il programma stty (113.2.2). Come si può vedere dall'esempio seguente, alcune combinazioni di tasti (rappresentate nella forma ^x) sono associate a delle funzioni. Nel caso di quelle appena descritte, le funzioni sono intr, susp e quit.

stty -a[Invio]

speed 38400 baud; rows 25; columns 80; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff
-iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
echoctl echoke

Riquadro 92.3. Le origini dei segnali dalla tastiera.

L'idea del segnale inviato attraverso la tastiera deriva dall'uso della telescrivente, con la quale, una serie di codici servivano per ottenere delle funzioni, senza generare un carattere da stampare. Questi codici fanno parte dello standard ASCII e, oltre ad avere una corrispondenza numerica, hanno un nome e una rappresentazione nella forma <^x>. Per esempio, il codice corrispondente al numero 316, si indica con il nome <ETX> (End of text) e viene rappresentato come <^c>.

Quando dalla telescrivente si passa alla tastiera di un elaboratore che utilizza un sistema operativo Unix, occorre considerare che i tasti e le combinazioni di tasti sono configurabili, pertanto vanno associati a delle funzioni della tastiera, quindi, alcune funzioni che non corrispondono alla produzione di codici che generano un carattere tipografico, vengono associate con stty all'invio di un segnale al processo in funzione, che usa la tastiera stessa. Quindi, la combinazione di tasti [Ctrl c] si presume sia associata alla funzione <Control_c>, che stty indica come ^C seguendo la tradizione della telescrivente.

92.2   Segnali attraverso la shell

Le shell offrono generalmente dei comandi interni per l'invio di segnali ai processi da loro avviati. In particolare, quelle che come Bash sono in grado di gestire i job, utilizzano i segnali in modo trasparente per fare riprendere un processo sospeso.

Per esempio, nel caso di Bash, se un processo viene sospeso attraverso la combinazione [Ctrl z], cosa che dovrebbe generare un segnale SIGTSTP (in base alla configurazione della linea di terminale), questo può essere riportato in primo piano e in funzione, attraverso il comando fg, con il quale in pratica si invia al processo un segnale SIGCONT.

92.3   Comando «kill»

Il modo normale per inviare un segnale a un processo è l'uso di kill: questo, a seconda dei casi, può essere un comando interno di shell o un programma. Il nome kill deriva in particolare dall'effetto che si ottiene utilizzandolo senza l'indicazione esplicita di un segnale da inviare: quello predefinito è SIGTERM attraverso il quale si ottiene normalmente la conclusione del processo destinatario.

Attraverso kill si riesce solitamente a ottenere un elenco dei segnali disponibili con il loro numero corrispondente. Ciò è molto importante per conoscere esattamente quale numero utilizzare con i programmi che non permettono l'indicazione dei segnali in forma verbale.

kill -l[Invio]

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGIOT       7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR

Nelle sezioni seguenti viene descritto il programma kill, mentre di solito, se non si indica esplicitamente che si fa riferimento a un programma, interviene il comando interno di shell.

92.3.1   Utilizzo di «kill»

Permette di inviare un segnale a uno o più processi identificati attraverso il loro numero PID:

kill [opzioni] [numero_pid...]

Se non viene specificato, il segnale predefinito è SIGTERM che normalmente procura la conclusione dell'esecuzione dei processi destinatari. Questo giustifica il nome kill. (1)

Tabella 92.5. Alcune opzioni.

Opzione Descrizione
-s segnale
Specifica il nome o il numero del segnale da inviare.
-l
Mostra l'elenco dei segnali disponibili con i numeri corrispondenti.

Segue la descrizione di alcuni esempi.

Negli esempi di questo documento viene indicato spesso il segnale da inviare senza l'opzione -s, usando piuttosto la forma -segnale. Questo modo di indicare il segnale riguarda il comando interno omonimo della shell Bash.

92.3.2   Utilizzo di «killall»

Il programma killall invia un segnale a tutti i processi che eseguono i comandi specificati.

killall [opzioni] [-segnale] [comando...]

Si utilizza quindi killall per inviare un segnale a dei processi identificati per nome. Se non viene specificato il segnale da inviare, si utilizza SIGTERM. I segnali possono essere indicati per nome o per numero. (2)

Tabella 92.6. Alcune opzioni.

Opzione Descrizione
-s segnale
Specifica il nome o il numero del segnale da inviare.
-l
Mostra l'elenco dei segnali disponibili con i numeri corrispondenti.

L'esempio seguente invia il segnale SIGHUP a tutti i processi avviati con il comando pippo. I processi soggetti a questo sono solo quelli che appartengono all'utente che invia il segnale.

killall -HUP pippo[Invio]

92.3.3   Utilizzo di «fuser»

Il compito normale di fuser è quello di elencare i processi che utilizzano i file indicati come argomento. In alternativa, fuser permette anche di inviare un segnale ai processi che utilizzano un gruppo di file determinato, attraverso l'opzione -k. Il programma fuser è già descritto nella sezione 91.3.1.

fuser [opzioni] file...

Appunti di informatica libera 2007.02 --- Copyright © 2000-2007 Daniele Giacomini -- <daniele (ad) swlibero·org>


1) Procps kill   GNU GPL

2) Psmisc   software libero con licenza speciale


Dovrebbe essere possibile fare riferimento a questa pagina anche con il nome invio_di_segnali_ai_processi.htm

[successivo] [precedente] [inizio] [fine] [indice generale] [indice ridotto] [indice analitico]

Valid ISO-HTML!

CSS validator!