title: Kill (Unix)
text: # 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.
  