Per usare funzioni e tipi sui processi usare le librerie:
#include <unistd.h>
#include<sys/types.h>
fork: creazione di un nuovo processo figlio (copia del padre, condivide file aperti)
execve, execv, execl,execlp,… : esecuzione di un nuovo programma nel contesto del processo corrente (non crea figli!), il nuovo processo eredita file aperti
getpid: pid del processo corrente
getppid: pid del padre
wait/waitpid: usate dal padre per aspettare la terminazione del figlio
Quando il processo padre non invoca la chiamata di sistema wait, il processo zombie continua a rimanere nella tabella dei processi:
Quando un processo perde il proprio
processo padre divenendo orfano, il processo init (pid=1) ne diventa
automaticamente il nuovo processo padre.
Il processo init (pid=1) esegue periodicamente la chiamata di sistema
wait terminando i propri processi figli zombie.
I processi zombie potenzialmente
inutili sono generati quindi da
genitori che che non eseguono wait/waitpid proseguendo
(per un certo tempo) la loro esecuzione
Esercizio 1
Verificare (usando fork, getpid, getppid, e messaggio a
video) che un processo Linux rimasto orfano
viene adottato dal processo init
(pid=1).
Esercizio 2
Scrivere un programma che genera un processo zombie (verificare tale evento
tramite messaggi a video) (per info sui processi zombie vedi commento.
Esercizio 3
Scrivere
per verificare che i file aperti (e quindi la posizione corrente) vengono
ereditati dai processi generati tramite fork.
Esercizio 4
Scrivere un programma C che prende come parametri N comandi e li esegue in N diversi sotto-processi generati tramite fork.
Fare in modo che il processo padre attenda la terminazione di ognuno dei figli prima di terminare la propria esecuzione
(utilizzare stampe a video per verificare i vari passi).
Esercizio 5
Scrivere un programma C che usa fork ed exec per creare due processi concorrenti, non sincronizzati, senza correre
il rischio di lasciare processi zombie potenzialmente
inutili (si possono pero’ generare orfani).