IMC!


Contenuti


Foto

 







Curiosando...
Novita  Novità Link  Link Blog  Blog English  Español 
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:
  1. 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.
  2. wait: Sospende l'esecuzione del processo padre, e attende un evento dal figlio (in genere che il figlio sia teminato).
  3. exit: Termina il processo corrente. I processi figli diventano figlii del processo con PID 1 (initrd).
  4. exec: Esegue un processo. In particolare, termina il processo corrente e assegna il suo PID al nuovo processo eseguito.
  5. getpid: Ottiene il PID del processo corrente.
  6. 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:



Password:

Riga:


Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324