01 - Creazione di processi
In questa pagina ci sono alcuni semplici codici in C, commentati, per mostrare l'uso delle principali funzioni di gestione dei processi sotto linux:
- fork: Duplica il processo corrente. Il processo padre vedr� come valore di ritorno il PID del figlio. Il processo figlio vedr� come valore di ritorno 0. Il figlio ha a disposizione una copia di tutte le variabili del padre (tranne la memoria allocata dinamicamente), e riprende l'esecuzione dal comando fork() in poi.
- wait: Sospende l'esecuzione del processo padre, e attende un evento dal figlio (in genere che il figlio sia teminato).
- exit: Termina il processo corrente. I processi figli diventano figlii del processo con PID 1 (initrd).
- exec: Esegue un processo. In particolare, termina il processo corrente e assegna il suo PID al nuovo processo eseguito.
- getpid: Ottiene il PID del processo corrente.
- getppid: Ottiene il PID del processo genitore.
Esempio 1: Uso di fork() #include <stdio.h>
/*
Questa funzione mostra l'uso di fork.
fork() crea una copia (figlio) del processo corrente (padre).
Il figlio erediter� una copia di tutte le variabili del padre,
e verr� eseguito a partire dal punto di codice corrente.
fork restituisce il pid del processo, in particolare:
Per il figlio pid = 0;
Per il padre pid = un numero maggiore di 0 che rappresenta il pid del figlio.
*/
main()
{
int mio_pid;
printf("Solo un processo a caso...\n");
mio_pid = fork(); // Crea due processi identici
if (mio_pid==0) // mio_pid varr� 0 se fork � stata lanciata dal figlio
printf("Io sono il figlio. Il risultato di fork per me vale: %d\n", mio_pid);
else if(mio_pid>0) // mio_pid varr� il pid del figlio se fork � stata lanciata dal padre
printf("Io sono il padre. Il risultato di fork per me vale: %d, cio� il pid di mio figlio\n", mio_pid);
else
printf("Errore!\n");
}
Esempio 2: Uso di wait() #include <stdio.h>
/* Questo esempio mostra l'uso di wait()
wait() sospende il padre fino a che il figlio termina (o altri casi pi� rari)
*/
main()
{
int pid, status;
pid=fork(); // Sdoppio il processo
if(pid==0)
{
/* Codice per il figlio */
printf("Sono il figlio. Aspetto 2 secondi.\n");
system("sleep 2");
}
else
{
/* Codice per il padre */
pid=wait(&status);
printf("Figlio terminato!\n");
}
}
Esempio 3: Creazione di una gerarchia di processi Questo programma crea una gerarchia di processi come mostrato in figura. Utilizzare:
ps -ajfx
nella bash di Linux per visualizzare la struttura a albero.
#include <stdio.h>
/* Questo programma crea 6 processi differenti secondo una gerachia
mostrata in figura. Per visualizzare la gerarchia usare "ps -ajfx".
*/
main()
{
int pid_A, pid_B, pid_C, pid_D, pid_E, pid_F;
if( (pid_A=fork())==0 )
{ // B, figlio di A
if( (pid_B=fork())==0 )
{ // D, figlio di B
printf(" D creato, figlio di B");
pause();
}
// la condizione nell'if serve per evitare che B venga eseguito se c'� stato un errore nella sua creazione
else if (getpid()>0)
{ //
printf("B creato, figlio di A");
pause();
}
}
else if (getpid()>0)
{ // A, padre del B e C
if((pid_C=fork())==0)
{ /* C, figlio di A */
if((pid_E=fork())==0)
{ // E, figlio di C
printf("E creato, figlio di C");
pause();
}
else if (getpid()>0)
{ // C, padre di E e F
if((pid_F=fork())==0)
{ // F, figlio di C
printf("F creato, figlio di C");
pause();
}
else if(getpid()>0)
{ // C, figlio di A
printf("C creato, figlio di A");
pause();
}
}
}
else if (getpid()>0)
{ // A, padre di B e C
pause();
}
}
}
Inserire la password di amministratore:
Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324
|