Indietro Indice Home PHC Avanti


Gruppi di processi e sessioni

Il programma più importante in un sistema linux è la shell, che legge da tastiera dei comandi e li interpreta in modo da eseguire certi processi. Come abbiamo detto per fare questo usa le funzioni fork() ed exec().

Un singolo comando può far partire più processi, ad esempio usando la pipe (`|') possiamo concatenare due processi in modo da ridirigere lo standard output del primo sullo standard input del secondo. L'insieme dei processi che sono fatti partire da un unico comando viene chiamato process group o job.

Una sessione invece è un insieme più grande di processi, che comprende di solito tutti i processi fatti partire da un unico login. Il primo di questi viene chiamato session leader. Quando un processo viene creato appartiene alla stessa sessione cui appartiene al padre; tramite però la funzione setsid il processo può divenire session leader di una nuova sessione. Questo muove il processo in un altro gruppo.

Normalmente si ha un solo session leader per login, e questo è la shell. Essa controlla il terminale attuale, e deve anche gestire i vari job che possono voler utilizzare contemporaneamente il terminale, assegnando a uno solo per volta il controllo dello stesso. Il processo che ha l'uso del terminale in un dato momento si dice essere in foreground, mentre gli altri sono in background. Se un processo in background ha necessità di scrivere sul terminale viene bloccato dal terminal driver.

Un utente può mettere in background un processo con il carattere SUSP (di solito `C-z'), che blocca il processo. A questo punto tramite il comando bg possiamo farlo continuare in background2. Per mettere un processo in foreground si usa il comando fg. Infine, per far partire un processo (o un gruppo di processi) direttamente in background si aggiunge alla fine del comando il carattere `&'.

Quando il processo che controlla il terminale (nel caso precedente è la shell) viene terminato manda a tutti gli appartenenti alla sessione un segnale (SIGHUP) che, se non è ignorato, causa la morte dei processi. Nel caso che il segnale sia ignorato (vedi successive sezioni) il processo non muore, ma diventa ``orfano'', cioè non appartiene più alla sessione, che non esiste, e diventa session leader. Se diamo il comando pstree il processo risulterà essere figlio di init.

Normalmente lo standard output (cioè il luogo in cui il processo scrive, se deve) e lo standard error (dove vengono scritti normalmente messaggi di errore) di un processo è il terminale controllato dal session leader, mentre lo standard input (cioè da dove prende eventuali informazioni durante l'esecuzione) è la tastiera. Questi possono essere modificati (ridiretti) all'avvio del processo, in modo, per esempio, da far scrivere su un file anziché sul terminale, oppure in modo da prendere da un file le informazioni che invece il processo avrebbe richiesto da tastiera.

Per ridirigere lo standard output esistono tre simboli chiave: |, >, >>.

Se si vuole far sì che lo standard output del processo sia lo standard input di un altro, come detto si usa la pipe (`|'). Esempio:
man bash -t | lpr
formatta la manpage di bash e la converte in formato postscript, che poi passa al comando lpr che la stampa.

Se lo si vuole ridirigere su un file scrivendo dall'inizio (e quindi cancellando il contenuto del file, se esiste) basta aggiungere '> file' in fondo. Esempio:
man bash -t > man_bash.ps
genera un file postscript man_bash.ps che contiene la manpage di bash.

Questo simbolo si usa anche per ridirigere lo standard error, e la sintassi è identica alla precedente, a meno di mettere un `2' davanti a `>'. Per esempio il comando
kdvi processi.dvi 2>/dev/null
non mi farà vedere nessuno dei messaggi normalmente stampati dal kdvi mentre elabora il file dvi.

Se si vuole ridirigere lo standard output su un file cominciando a scrivere dalla fine del file, senza cancellare l'eventuale contenuto del file basta aggiungere '>> file' in fondo. Esempio:
for i in *; do echo ``questo e' il file $i''>> cippa; done
aggiunge al file cippa una riga per ogni file contenuto nella directory corrente scrivendo questo e' il file seguito dal nome del file.

Per ridirigere lo standard input, oltre al già citato `|', esiste anche il simbolo `<', che permette di sostituire la tastiera con un file. Per esempio
sort < file
stamperà le righe contenute nel file file in ordine alfabetico.


Antonio Messina
2000-03-17