Tubes - Erreur mysterieuse.

Tubes - Erreur mysterieuse. - C - Programmation

Marsh Posté le 07-05-2005 à 15:56:57    

Salut, voila je suis dans les tubes la j'ai un ptit prog ou j'ai un pere qui est censé lire les messages envoyés par ces deux fils par l'intermediare d'un petit pipe et j'ai donc un souci avec un wait ...
 

Code :
  1. #include <stdio.h>
  2. #include <sys/wait.h>
  3. #include <unistd.h>
  4. #include <stdlib.h>
  5. #include <fcntl.h>
  6. void pere();
  7. void fils1();
  8. void fils2();
  9. #define MESS_LENGTH 54
  10. #define NB_MESS     100
  11. static char buff[MESS_LENGTH];
  12. int tube[2];
  13. int main (void){
  14.  
  15.   if (pipe(tube) < 0) printf("Ereur creation du tube\n" );
  16.  
  17.   pere();
  18.   return 0;
  19. }
  20. void pere(){
  21.   pid_t pid1, pid2;
  22.   pid_t pid_wait;
  23.   int status;
  24.   int cr;
  25.  
  26.   if ( (pid1 = fork()) < 0) printf("Ereur fork fils\n" );
  27.  
  28.   if (pid1 == 0){
  29.   /* On appele la fonction qui cree le pemier fils */
  30.       fils1(); 
  31.   }else{
  32.   /* On est dans le pere la */
  33.      if ( (pid2 = fork()) < 0) printf("Ereur fork deuxieme fils\n" );
  34.    
  35.      if (pid2 == 0){
  36.       /* On appele la fonction qui cree le deuxieme fils */
  37.       fils2(); 
  38.      }else{
  39.       /* On est dans le pere la */
  40.       /* Le pere est en lecture du tube : il ferme l'extremité d'ecriture */
  41.       close(tube[1]);
  42.      
  43.       /*Lecture des messages sur le tube jusqu'a la fin de fichier */
  44.       while ( (cr = read(tube[0], buff, MESS_LENGTH)) > 0){
  45.            printf("%s\n", buff);
  46.       }
  47.       if (cr < 0) printf("Ereur de lecture du pere\n" );
  48.      
  49.       /***********************************************************************************/
  50.       /* attente d'un premier fils */
  51.       if ( (pid_wait = wait(&status)) < 0) printf("Ereur attente premier fils\n" );
  52.      
  53.       printf("Pere=> fin du fils%d : pid = %d ;", (pid_wait == pid1)?1:2, pid_wait);
  54.       printf(" status = %x\n", status);
  55.      
  56.       /***********************************************************************************/
  57.       /* attente d'un deuxieme fils */
  58.       if ( (pid_wait = wait(&status)) < 0) printf("Ereur attente deuxieme fils\n" );
  59.      
  60.       printf("Pere=> fin du fils%d : pid = %d ;", (pid_wait == pid1)?1:2, pid_wait);
  61.       printf(" status = %x\n", status);
  62.      
  63.       }}
  64.      }/*pere*/
  65. void fils1(){
  66. /* le fils1 est ecrivain, il ferme l'extremité en lecture */
  67. close(tube[0]);
  68. /* preparation du message */
  69. char mess[MESS_LENGTH];
  70. int i;
  71. for(i=1; i<=NB_MESS; i++){
  72.         sprintf(mess, "%03d %s", i, "111111111111111111111111111111111111111111111111111111111111" );
  73.         write(tube[1], mess, MESS_LENGTH);
  74. }
  75. close(tube[1]); /* pourque le lecteur detecte la fin de fichier */
  76. exit(0);
  77. }
  78. void fils2(){
  79. /* le fils2 est ecrivain, il ferme l'extremité en lecture */
  80. close(tube[0]);
  81. /* preparation du message */
  82. char mess[MESS_LENGTH];
  83. int i;
  84. for(i=1; i<=NB_MESS; i++){
  85.         sprintf(mess, "%03d %s", i, "2222222222222222222222222222222222222222222222222222222222222" );
  86.         write(tube[1], mess, MESS_LENGTH);
  87. }
  88. close(tube[1]); /* pourque le lecteur detecte la fin de fichier */
  89. exit(0);
  90. }


 
Je compile sans souci ... c'est a l'execution qui l'attente du premier fils provoque une erreur:
 

Citation :


[chronk@localhost 04.tubes]$ ./tubeP2F
Ereur attente premier fils
Pere=> fin du fils2 : pid = -1 ; status = 400d5fa2
Ereur attente deuxieme filsPere=> fin du fils2 : pid = -1 ; status = 400d5fa2
Pere=> fin du fils2 : pid = 6042 ; status = 0
Ereur attente premier fils
Pere=> fin du fils2 : pid = -1 ; status = 400d5fa2
Ereur attente deuxieme filsPere=> fin du fils2 : pid = -1 ; status = 400d5fa2
Pere=> fin du fils2 : pid = 6041 ; status = 0
Ereur attente deuxieme filsPere=> fin du fils2 : pid = -1 ; status = 0
Pere=> fin du fils2 : pid = 6040 ; status = 0


 
Quelqu'un as t-il une idée par hasard svp ?
 
EDIT: Moi etre boulet moi etre dsl !


Message édité par Chronoklazm le 07-05-2005 à 19:55:53

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
Reply

Marsh Posté le 07-05-2005 à 15:56:57   

Reply

Marsh Posté le 09-05-2005 à 14:40:42    

Je viens de compiler et tester ton code...ça a l'air de bien marcher. il affiche 100 lignes de "111..." et 100 lignes de "222..." puis le père récupère la fin des des 2 fils. Je vois pas de problème.


---------------
-= RAK =-
Reply

Sujets relatifs:

Leave a Replay

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