Un processo è un programma (o, più spesso, parte di esso). Quando avii un programma, tu avii un processo. Quando, per esempio, chiedi di viasualizzare il contenuto della directory digitando ls (sotto Unix/Linux) tu avii un programma (un processo) chiamato ls.
A cosa servono, a questo punto, mi sembra ovvio... se vuoi fare qualcosa devi avviare un processo.
Come si usa il fork: fork() è una chiamata di sistema che non fa altro che duplicare il processo corrente. Prende l'intero codice in esecuzione e ne crea una copia, pari pari, assegnandogli un PID (Process IDentifier). Il processo che ha effettuato la chiamata a fork() si dice processo padre, mentre la copia creata si chiama processo figlio.
Il padre conosce il PID del figlio, mentre il figlio vede il suo PID come 0. In questo modo si può discriminare fra processo padre e processo figlio, semplicemente controllandone il PID.
La chiamata fork() restituisce il PID del processo: nel caso del padre restituisce il PID del figlio, nel caso del figlio restituisce 0.
Come si usa fork():
codice:
pid_t pid; /* dichiaro una variabile che conterrà il pid del processo generato con fork() */
... // codice eseguito
if (pid = fork()) { /* Qui viene eseguita la fork()!!! */
/* quindi il processo viene duplicato!! */
/* Se entro qui, significa che pid è diverso da 0 (in particolare > 0) */
/* codice eseguito dal padre */
printf("Ciao! Io sono il processo padre!\n")
} else {
/* Se entro qui, significa che pid è 0
codice eseguito dal processo figlio */
printf("ciao! Io sono il processo figlio!\n");
exit(0); /* Voglio che il figlio a questo punto muoia!! */
}
/* Codice eseguito solamente dal processo padre */
waitpid(0); /* Attendo che il figlio muoia! */
printf("Ora il processo figlio è terminato!\n");
Spero di essere stato sufficientemente chiaro. La gestione dei processi Unix/Linux all'inizio può sembrare oscura e complessa, ma alla fine risulta semplice ed intuitiva. Tutto si gioca sul "copia e incolla" del codice e sul discriminante PID.
Ciao.