precessus(fork) --->> explication

precessus(fork) --->> explication - C - Programmation

Marsh Posté le 09-09-2003 à 17:28:43    

On ma donner ce petit programme, mais jene vois pas ce qu'il fait, on pourrait m'expliquer svp ,??
 
 
 
 
void main(void)
{
int i;char txt[40];
write(STDOUT_FILENO,"programme debut<n",16);
for (i=1;i<3;i++)
{
 if((fork())==0)
 {
  sprintf(txt,"        " );
  sprintf(txt,"\nprocessus fils n %d, %d",i,getpid());
  write(1,txt,40);
 }
 else
 {
  sprintf(txt,"        " );
  sprintf(txt,"\nprocessus pere i= %d, %d",i,getpid());
  write(1,txt,40);
 }
}
sprintf(txt,"                                       " );
sprintf(txt,"fin du processus %d",getpid());
write(1,txt,40);
}
   
resultat
********
programme debut<
processus fils n 1, 22352
processus fils n 2, 22610 fin du processus 22610
processus pere i= 2, 22352 fin du processus 22352
processus pere i= 1, 21838
processus fils n 2, 22612 fin du processus 22612
processus pere i= 2, 21838 fin du processus 21838

Reply

Marsh Posté le 09-09-2003 à 17:28:43   

Reply

Marsh Posté le 09-09-2003 à 19:09:07    

il crée un processus appelé père qui en engendre un autre appelé fils

Reply

Marsh Posté le 09-09-2003 à 19:16:25    

je completerai en disant :
 
fork()==0
=> code éxécuté par le processus père
fork()!=0
=> code du fils

Reply

Marsh Posté le 09-09-2003 à 19:16:29    

zouzouille a écrit :

On ma donner ce petit programme, mais jene vois pas ce qu'il fait, on pourrait m'expliquer svp ,??


 
 
essaie d'utiliser les balises "cpp" de ce forum (bouton c/c++ quand tu composes ton message) , c'est plus joli.
 
fork permet de dupliquer un programme.
après l'execution de fork, on se retrouve avec deux programmes identiques en mémoire.
identique ? pas tout à fait. La valeur de retour du fork permet de différencier les deux programmes en cours d'execution.
si le fork a retourné 0, on est dans le processus 'père'
si le fork a retourné quelque chose différent de 0, on est dans le processus fils.
 
 
 

Code :
  1. void main(void)
  2. {


 
bof, ceci est mieux (du point de vue du standard):

Code :
  1. int main(void)
  2. {


 

Code :
  1. int i;char txt[40];


éviter de déclarer plus d'une variable par ligne
 
 

Code :
  1. write(STDOUT_FILENO,"programme debut<n",16);


faute de frappe pour le signe inférieur.
sinon un petit printf aurait suffi.
 

Code :
  1. for (i=1;i<3;i++)
  2. {
  3. if((fork())==0)
  4. {
  5.   sprintf(txt,"        " );
  6.   sprintf(txt,"\nprocessus fils n %d, %d",i,getpid());
  7.   write(1,txt,40);
  8. }


un simple

Code :
  1. printf("\nprocessus fils n %d, %d",i,getpid());


aurait suffi.
 

Code :
  1. else
  2. {
  3.   sprintf(txt,"        " );
  4.   sprintf(txt,"\nprocessus pere i= %d, %d",i,getpid());
  5.   write(1,txt,40);
  6. }
  7. }
  8. sprintf(txt,"                                       " );
  9. sprintf(txt,"fin du processus %d",getpid());
  10. write(1,txt,40);
  11. }


idem.
 
rajouter un petit "return 0; " a la fin pour faire joli et respecter le prototype sdandard du main et c'est déjà mieux.
 
 


resultat
********
programme debut<
processus fils n 1, 22352
processus fils n 2, 22610 fin du processus 22610
processus pere i= 2, 22352 fin du processus 22352
processus pere i= 1, 21838
processus fils n 2, 22612 fin du processus 22612
processus pere i= 2, 21838 fin du processus 21838


 
 
première boucle, après le fork on a deux programmes avec i=1;
un fils et un père.
on aura une ligne "père i=1" et une ligne "fils i=1".
 
ensuite on passe au prochain tour de boucle dans les deux programmes, on a donc i=2.
chaque programme va engendrer un père et un fils lors de l'appel du fork, résultat deux lignes "père i=2" et deux lignes "fils i=2"
 
prochain tour de boucle, i = 3, youpi tout le monde meurt.


Message édité par SquiZZ le 09-09-2003 à 19:17:02
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed