You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
CORSO DI FONDAMENTI DEI SISTEMI OPERATIVI<br />
A.A. 2012-2013<br />
(Prof. G. Piscitelli)<br />
Distinguiamo le seguenti categorie di segnali in base alla loro origine:<br />
- Segnali provenienti dal terminale: generati quando l'utente utilizza alcune combinazioni di tasti quali Ctrl+C<br />
(SIGINT) o Ctrl+Z (SIGSTOP).<br />
- Segnali derivanti da eccezioni hardware: generati dall'hardware quando si verificano eventi quali la divisione<br />
per 0 o il tentativo di accesso ad un'area di memoria non valida; gli eventi vengono rilevati dal kernel che invia il<br />
segnale corrispondente al processo che ha causato le eccezioni (ad esempio SIGSEGV).<br />
- Segnali provenienti dalla funzione kill(2) (e dal comando kill(1)) kill verso un determinato PID.<br />
- Segnali collegati ad eventi software: generati quando accade un evento di cui un processo deve essere<br />
informato; è il caso, ad esempio, di un processo che scrive in una pipeline mentre il processo che legge è già<br />
terminato (set | less); in tale ipotesi il primo riceve un segnale SIGPIPE quando il secondo termina.<br />
La generazione di un segnale e la sua notifica passano attraverso il kernel che li gestisce utilizzando una coda di<br />
segnali pendenti. La notifica è un evento asincrono rispetto alla generazione e dipende dal kernel. Sui sistemi<br />
Linux un segnale standard (non real time) viene inserito nella coda dei segnali pendenti solo se non è già<br />
presente. In pratica inviando n volte lo stesso segnale standard ad un processo: la prima istanza viene inserita in<br />
coda, mentre quelle successive vengono scartate fintanto che la prima è in coda.<br />
Il processo che riceve il segnale può decidere di gestirlo in 3 modi:<br />
- ignorare il segnale;<br />
- catturare il segnale specificando una funzione detta signal handler da eseguire;<br />
- eseguire l'azione di default associata al segnale (molto spesso la terminazione del processo).<br />
I segnali SIGKILL (9) e SIGSTOP (19) non possono essere né catturati né ignorati ma eseguono sempre l'azione<br />
di default. Le azioni di default sono specificate nella pagina di manuale signal(7).<br />
Regole di protezione: per inviare un segnale utilizzando la system call kill (ed il comando kill) è necessario che<br />
l'uid (real o effective) del processo mittente sia uguale all'uid (real o effective) del processo destinatario. L'utente<br />
root può inviare segnali a tutti i processi.<br />
kill<br />
Il comando kill permette di inviare un segnale ad un processo, indicando direttamente il PID del processo. Se<br />
non si specifica nessun segnale viene inviato SIGTERM (15), che è catturabile.<br />
SINTASSI: $ kill [opzioni] [PID]<br />
Opzioni:<br />
-s nome_segnale Invia il segnale nome_segnale al processo con #id PID<br />
-nome_segn<br />
-num_segn<br />
-l Elenca tutti i segnali ed i loro valori numerici (64 diversi segnali)<br />
$ kill -SIGINT 1722<br />
$ kill -INT 1722<br />
$ kill -2 1722<br />
Esercitazioni comandi <strong>shell</strong> <strong>Bash</strong> (Ing. S. Giannini) Pagina 46