Fork et programme aléatoire

Fork et programme aléatoire - C - Programmation

Marsh Posté le 13-10-2007 à 15:50:44    

Bonjour
 
Je réalise un programme en c qui, pour le moment, doit faire communiquer deux processus par un pipe.
Or selon l'ordre dans lequel l'ordonnanceur fait passer les processus mon programme marche ou ne marche pas.
Je ne vois vraiment pas quelle est la partie du code posant problème.
 
Voila le code:

Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. int main(int argc, char **argv)
  6. {
  7. pid_t pid;
  8. printf("\n 1) je suis dans main et mon pid est %i \n",getpid());
  9. /*---------Création du 1er processus fils--------------*/
  10. pid = fork();  //pid = pid du fils
  11. /*---------si le fork ne cree pas un nouveau processus---------*/
  12. if (pid < 0)
  13. {
  14.  perror("fork" );
  15.  return 1;
  16. }
  17. /*-----------si on est dans p1-----------*/
  18. else if (pid)
  19.  {
  20.   printf("\n 2) Je suis dans p1\n" );
  21.   printf("\n Le PID du processus P1 est: %i \n", getpid());
  22.   printf("\n Le PID du processus main est: %i \n", getppid());
  23.   /*---------creation d'un 2eme processus-------------*/
  24.   pid=fork();   // creation de p2
  25.   /*-----------si erreur------------*/
  26.   if(pid<0)
  27.   {
  28.    perror("fork" );
  29.    return 1;
  30.   }
  31.   /*-----------si pid est egal a 0 on est dans p2------------*/
  32.   else if(pid)
  33.    {
  34.     printf("\n 3) Je suis dans P2\n" );
  35.     printf("\n Le PID du processus P1 est: %i \n", getppid());
  36.     printf("\n Le PID du processus P2 est: %i \n", getpid());
  37.    }
  38.   /*----------sinon on est dans p1-----------*/
  39.   else
  40.    {
  41.     printf("\n 4) Je suis dans P1" );
  42.     printf("\n Le PID du processus P1 est: %i \n", getpid());
  43.    }
  44.  }
  45. else
  46.  {
  47.   printf("\n 5) Je suis dans main" );
  48.   printf("\n Mon PID est de: %i \n", getpid());
  49.   printf("\n Le PID du processus P1 est: %i \n", pid);
  50.  }
  51. }


 
Et voila le code de ma console quand ca ne va pas
 
            1) je suis dans main et mon pid est 5779  
 
            5) Je suis dans main
            Mon PID est de: 5780  
 
            Le PID du processus P1 est: 0  
 
            2) Je suis dans p1
 
            Le PID du processus P1 est: 5779  
 
            Le PID du processus main est: 5351  
 
            4) Je suis dans P1
            Le PID du processus P1 est: 5781  
            Le titre de ma fenetre est: Processus P1  
 
            3) Je suis dans P2
 
            Le PID du processus P1 est: 5351  
 
            Le PID du processus P2 est: 5779  
 
            descripteur de p1 vers p2 3  
 
            descripteur de p2 vers p1 3
 
Je ne comprend absolument pas comment le pid de main peut il varier  entre le début et la fin de mon code. :pt1cable:  
 
Et pourquoi quand je fais printf("\n Le PID du processus P1 est: %i \n", pid); il me retourne le code 0 alors que p1 étant conçu il devrait me retourner le pid de p1.
 
 
Merci d'avance de votre aide.
Je me tiens à votre disposition
 
edit:simplification du code


Message édité par Anonymouse le 13-10-2007 à 17:08:13
Reply

Marsh Posté le 13-10-2007 à 15:50:44   

Reply

Marsh Posté le 13-10-2007 à 20:19:56    

'Soir,
Suis pas un expert mais d'apres le man:

Citation :


RETURN VALUES
     Upon successful completion, fork() and fork1() return  0  to
     the  child  process  and  return the process ID of the child
     process to  the  parent  process.  Otherwise,  (pid_t)-1  is
     returned to the parent process, no child process is created,
     and errno is set to indicate the error.


Je crois que tu as mal compris la valeur de retour du fork!
Quand tu ecris "if (pid) ..." la suite est dans le main car "fork renvoie le pid dans le pere" (donc pid!= 0).


Message édité par breizhbugs le 13-10-2007 à 20:21:40
Reply

Marsh Posté le 13-10-2007 à 20:56:50    

Ouais c'était ca merci de ton aide :D

Reply

Sujets relatifs:

Leave a Replay

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