Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1238 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Tubes - Erreur mysterieuse.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tubes - Erreur mysterieuse.

n°1074790
Chronoklaz​m
Posté le 07-05-2005 à 15:56:57  profilanswer
 

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 !
mood
Publicité
Posté le 07-05-2005 à 15:56:57  profilanswer
 

n°1076360
Rak111
Posté le 09-05-2005 à 14:40:42  profilanswer
 

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 =-

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Tubes - Erreur mysterieuse.

 

Sujets relatifs
erreur à l'execution sous jCreatorerreur de segmentation pourtant simple
Erreur : Accès refusé pour l'utilisateur: 'postgres'@'@localhost' (motMessage d'erreur - requete SQL (resolu)
Erreur LINK : impossible de compilerErreur de Link : LNK1104 : file introuvable c:\Program.obj
prob de conenction via l'api mysql c (Erreur 10061)erreur javax.servlet.ServletException: BeanUtils.populate
Erreur de lecture fichier SQL [résolu]erreur de formulaire ????
Plus de sujets relatifs à : Tubes - Erreur mysterieuse.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR