# Kill (Unix)

In informatica kill (dalla lingua inglese to kill, uccidere) è un comando dei sistemi operativi Unix e Unix-like, e più in generale dei sistemi POSIX, che invia un segnale ad uno o più processi tipicamente per provocarne la terminazione (come suggerisce il nome), oppure visualizza informazioni sui segnali.
kill è anche il nome di una chiamata di sistema definita dallo standard POSIX che invia un segnale ad un processo. Di fatto il comando kill agisce invocando l'omonima chiamata di sistema.

## Il comando kill

La sintassi generale del comando kill presenta due forme: una per inviare un segnale ad uno o più processi, e l'altra per ottenere informazioni sui segnali.

### Invio di segnali

La sintassi in questo caso è:
I parametri arg identificano i processi a cui inviare i segnali, che possono essere specificati nei due modi che seguono:
* dei PID, secondo le stesse convenzioni dell'omonima chiamata di sistema (per cui è anche possibile specificare 0 o -1 o valori inferiori);
* degli identificativi di job della shell, secondo la seguente sintassi:
** %% o %+: indica il job corrente;
** %-: indica il job precedente;
** %n: indica il job con identificativo n;
** %stringa: indica il job la cui riga di comando inizia con stringa;
** %?stringa: indica il job la cui riga di comando contiene stringa.
Il doppio trattino -- (facoltativo) indica che i parametri successivi non sono da considerarsi opzioni.
Il comportamento predefinito è quello di inviare il segnale SIGTERM.
Tra le opzioni vi sono:

#### -s segnale

    Invia il segnale specificato invece di SIGTERM. Il parametro segnale può essere specificato sia in forma simbolica, con o senza il prefisso "SIG", sia in forma numerica, e può essere anche 0 per verificare solo la possibilità di spedire segnali

#### -segnale

    Equivale all'uso di "-s segnale" (sintassi tradizionale).
Ad esempio "kill -s SIGKILL 1234", "kill -9 1234" e "kill -KILL 1234" sono equivalenti tra loro.

### Informazioni sui segnali

La sintassi in questo caso è:
Il parametro facoltativo valore può indicare:
* il numero di un segnale, nel qual caso viene scritto sullo standard output il nome del segnale senza il prefisso "SIG";
* il valore di uscita di un comando che è terminato a causa del ricevimento di un segnale, come ad esempio ottenuto dalla variabile speciale "$?" della shell testuale, nel qual caso viene scritto sullo standard output il nome (senza il prefisso "SIG") del segnale che ha causato la terminazione del comando. Notare che non è corretto specificare un valore di uscita qualsiasi, ma occorre prima accertarsi che la terminazione sia dovuta ad un segnale (tipicamente, in questo caso, il valore di uscita è maggiore di 128).
Se il parametro valore non è specificato, viene prodotto sullo standard output un elenco dei segnali noti al sistema.

### Esempi

Manda il segnale SIGTERM ai processi aventi PID 1234 e 5689:
Manda il segnale SIGKILL al processo 1234:
Manda il segnale SIGKILL al processo 1234:
Manda il segnale SIGKILL al processo 1234:
Elenca i segnali disponibili:
Manda il segnale SIGTERM ai processi del job corrente della shell (solitamente l'ultimo avviato):
Manda il segnale SIGTERM ai processi del job numero 5 della shell:

### Alternative

In alcuni sistemi operativi Unix e Unix-like sono disponibili anche i comandi killall e pkill, che inviano un segnale a tutti i processi che soddisfano dei criteri di ricerca specificati come parametri. Con questi comandi è ad esempio possibile inviare un segnale a tutti i processi di un dato utente, o a tutti quelli il cui nome contiene una stringa specificata.

## La chiamata di sistema kill

La chiamata di sistema kill è dichiarata nello header file signal.h:
Prima di inviare il segnale, essa verifica che il chiamante abbia il permesso di inviare segnali al processo o al gruppo di processi indicato.
Il tipo pid_t è un tipo opaco che rappresenta un PID e che inoltre può anche assumere un valore uguale o inferiore a zero.
Il parametro pid indica il processo o il gruppo di processi a cui inviare il segnale:
* se è maggiore di 0, il segnale specificato da sig è inviato al processo avente il PID specificato;
* se è uguale a 0, il segnale specificato da sig è inviato a tutti i processi del gruppo di processi di cui il chiamante fa parte;
* se è uguale a -1, il segnale specificato da sig è inviato a tutti i processi del sistema a cui il chiamante ha il permesso di inviare segnali, eccetto che ad un insieme ristretto di processi che dipende dall'implementazione (tipicamente init);
* se è minore di -1, il segnale specificato da sig sarà inviato a tutti i processi appartenenti al gruppo di processi identificato dal valore assoluto di pid.
Il parametro sig indica il segnale da spedire; le costanti che identificano i segnali sono elencate nello header file signal.h. Se è 0 non viene spedito alcun segnale, ma si verifica unicamente la possibilità di inviare segnali al processo o al gruppo di processi indicati.

### Valore di ritorno

In caso di successo viene ritornato il valore 0, altrimenti viene ritornato il valore -1 e la variabile errno indica l'errore specifico.

### Errori

Quando kill ritorna -1, errno può valere:
* EINVAL – sig non è un numero di segnale valido.
* EPERM – Il chiamante non ha il permesso di inviare il segnale sig al processo o al gruppo di processi identificato da pid.
* ESRCH – Non esiste processo o gruppo di processi corrispondenti al pid specificato.