Indietro | Indice | Home PHC | Avanti |
I processi possono comunicare tra di loro in diversi modi, e cioè:
Una pipe è un semplice metodo per far sì che due processi possano passarsi uno stream di dati. Semplicemente un processo scrive da una parte ed un altro legge ciò che il primo scrive. I dati sono ordinati in modo che ciò che è scritto per prima viene anche letto per prima (si tratta, appunto, di una FIFO: first-in-first-out). Si ha una pipe quando si concatenano da linea di comando più comandi separati da '|'. Ad esempio:
[messina@poisson public_html $] cat *.html|tr '>' '\012'|grep \ SRC|cut -d '"' -f2 pam-censur.jpg marchio.gif lavoriincorso.gif winslow.gif email.gif openlogo-50.jpg penguin2.gif Logo.jpg [messina@poisson public_html $]
Esistono poi dei file speciali, delle fifo, appunto, che si creano con il comando mknod, e che funzionano come le pipe, ma restano su disco, in modo che i processi possano collegarsi ad essi semplicemente tramite il nome.
I segnali sono delle brevi informazioni che i processi si scambiano durante l'esecuzione, e che possono tornare molto utili in diverse occasioni, visto che esiste un programma, kill, che permette di mandare ad un particolare processo un segnale a scelta. Per sapere quanti segnali sono disponibili potete dare il comando kill -l.
[messina@poisson seminario$] kill -l 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR 31) SIGSYS [messina@poisson seminario$]
Tramite l'opzione '-s' seguita dal nome del segnale e dal PID del processo si può mandare quel segnale a quel processo. Se non si ha lo stesso uid di quello effettivo del processo, o al limite uid=0 (che è quello dell'utente root) il segnale non ha effetto.
Di seguito un breve elenco del significato dei segnali (cfr man 7 signal)
La connessione è stata chiusa, o il processo controllante del terminale è morto. Quando un il processo che controlla un terminale muore, il terminale da lui controllato resta libero. Per prevenire problemi, visto che i processi suoi figli potrebbero voler accedervi, viene loro mandato un segnale di SIGHUP, che in genere provoca la morte del processo, che i processi possono ignorare. Se lo fanno non potranno piú accedere ad un terminale.
Sarebbe il segnale mandato quando l'utente digita la combinazione corrispondente a INTR, di solito `C-c'
Simile al precedente, ma produce anche un core dump e viene da un'altra combinazione di tasti. (`C-\', di solito)
In genere significa che il programma è corrotto in qualche modo, che ha tentato di eseguire dei dati, o in caso di stack overflow, visto che il compilatore dovrebbe accorgersi se il programma farà qualcosa di illegale...
È un segnale che il processo manda quando si accorge di qualche errore, tramite la funzione abort.
Errore aritmetico in generale: overflow, divisione per zero...
Uccide il processo SICURAMENTE. Non puo' essere ignorato. Di solito viene usato solo su esplicita richiesta. Se il processo non muore vuol dire che si è di fronte ad un baco del sistema operativo (segnalarlo). In seguito a questo segnale il processo è terminato immediatamente, a differenza del segnale SIGTERM.
Riferimento di memoria non valido.
Se un processo scrive su una PIPE o una FIFO, e il processo che deve leggervi non parte o smette di leggere inaspettatamente, il processo scrivente riceve questo segnale.
Allarme di alarm(2)
È un segnale che richiede al processo di terminare. A differenza di SIGKILL può essere ignorato. È il segnale di default del comando `kill'.
Primo segnale definito dall'utente
Secondo segnale definito dall'utente
Quando un processo viene terminato o bloccato, manda un segnale al processo padre. In genere viene ignorato.
Continua se fermato. È il risultato del comando bg, quando rivolto ad un processo bloccato in background.
Blocca il processo. Puo' essere ignorato. È il segnale che riceve un processo in background quando necessita di scrivere sul terminale, o quello che mandiamo con la combinazione di tasti `C-z'.
Stop digitato sul tty
Input da tty per un processo in background. Quando un processo in background tenta di leggere dal terminale riceve un segnale SIGTTIN. Di default il risultato è di bloccare il processo.
Output da tty per un processo in background. Simile al precedente, si verifica se il processo vuole scrivere sul terminale.
Se volete uccidere un processo che non potete chiudere normalmente (tipico: il Netscape che si pianta o che continua a girare senza che esistano più finestre...) potete provare con il comando kill, ma se questo non ha effetto (SIGTERM può essere ignorato!), digitando kill -s sigkill seguito dal PID del processo sicuramente morirà. Ovviamente i processi in stato di zombie, come già detto, essendo già morti sono immuni a questo comando.