31.05.2013 Views

Comandi Bash shell - SisInf Lab

Comandi Bash shell - SisInf Lab

Comandi Bash shell - SisInf Lab

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!