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[1], 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[2] che invia un segnale ad un processo. Di fatto il comando kill agisce invocando l'omonima chiamata di sistema.

Il comando kill

[modifica | modifica wikitesto]

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

[modifica | modifica wikitesto]

La sintassi in questo caso è:

kill [opzioni] [--] arg1 [arg2 …] 

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

[modifica | modifica wikitesto]

La sintassi in questo caso è:

kill -l [valore] 

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.

Manda il segnale SIGTERM ai processi aventi PID 1234 e 5689:

kill 1234 5689 

Manda il segnale SIGKILL al processo 1234:

kill -s SIGKILL 1234 

Manda il segnale SIGKILL al processo 1234:

kill -KILL 1234 

Manda il segnale SIGKILL al processo 1234:

kill -9 1234 

Elenca i segnali disponibili:

kill -l 

Manda il segnale SIGTERM ai processi del job corrente della shell (solitamente l'ultimo avviato):

kill %% 

Manda il segnale SIGTERM ai processi del job numero 5 della shell:

kill %5 

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

[modifica | modifica wikitesto]

La chiamata di sistema kill è dichiarata nello header file signal.h:

#include <signal.h> int kill(pid_t pid, int sig); 

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

[modifica | modifica wikitesto]

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

Quando kill ritorna -1, errno può valere:

  • EINVALsig 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.
  1. ^ (EN) kill (utilities), in The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008. URL consultato il 14-06-2009.
  2. ^ (EN) kill (functions), in The Open Group Base Specifications Issue 7 IEEE Std 1003.1-2008. URL consultato il 14-06-2009.

Voci correlate

[modifica | modifica wikitesto]
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica