Problème avec wait

Problème avec wait - C - Programmation

Marsh Posté le 10-10-2011 à 10:34:03    

Bonjour à tous,
 
j'ai un petit soucis avec la fonction wait() dont voici le code :  
 
fprintf(stderr,"Avant fork()\n" );
pid = fork ();    
fprintf(stderr,"pid : %d - Apres fork()\n", pid);
switch (pid)
{
  case (pid_t)0 : /* creation du processus fils */
  {
       fprintf(stderr,"Je suis le fils et je vais lancer mon prog\n" );
       etat=execlp("prog",
       "prog",
       "CUC",
       "non",
       "annule",
        NULL);
 
   /* Echec de l'execution */
   fprintf(stderr,"Erreur lors de la tentative d'execution du " );
   fprintf(stderr," batch bref_demande_copie \n" );
   break;
  }
 
 case (pid_t) (-1) : /* creation du fils impossible */
    {
      fprintf(stderr,"Execution du batch bref_demande_copie " );
      fprintf(stderr,"impossible (annulation de la demande de copie " );
      fprintf(stderr,"du referentiel CUC non effectuee) \n" );
      break;
    }
 
       default : /* Le processus pere attend le processus fils */
    {
      fprintf(stderr,"Je suis le pere et j'attends le processus fils : %d - Attente......\n", pid);
      pid=wait(etatpere);
      fprintf(stderr,"J'ai fini d'attendre\n" );
      if (WIFEXITED (etat))
      {
       if (WEXITSTATUS(*etatpere) !=0)
       {
         fprintf (stderr,"Echec de la reinitialisation de la " );
         fprintf (stderr,"demande de copie (statut : %d) \n",WEXITSTATUS(*etatpere));
       }
      }
      else
      {
       if (WIFSIGNALED(*etatpere))
       {
         fprintf (stderr,"Signal recu lors de la reinitialisation " );
         fprintf (stderr,"de la demande de copie : %d \n",WTERMSIG(*etatpere));
       }
      }
    }
 }

 
Le problème c'est que j'ai mon fils qui exécute bien le programme voulu mais le processus père reste en attente indéfiniment
 
Quelqu'un aurait-il une idée sur ce problème ?
 
Merci
 

Reply

Marsh Posté le 10-10-2011 à 10:34:03   

Reply

Marsh Posté le 10-10-2011 à 11:23:01    

Bon finalement j'ai contourné mon problème en utilisant la fonction waitpid.
J'ai donc remplacé la ligne :  
pid=wait(etatpere);
par
pid=waitpid(pid,&etatpere,0);
 
et ça marche mieux, le père se termine sans problème et le fils a bien fait son boulot.
 
Par contre si quelqu'un a une explication concernant le problème avec wait() je suis preneur..........
 
 

sal1 a écrit :

Bonjour à tous,
 
j'ai un petit soucis avec la fonction wait() dont voici le code :  
 
fprintf(stderr,"Avant fork()\n" );
pid = fork ();    
fprintf(stderr,"pid : %d - Apres fork()\n", pid);
switch (pid)
{
  case (pid_t)0 : /* creation du processus fils */
  {
       fprintf(stderr,"Je suis le fils et je vais lancer mon prog\n" );
       etat=execlp("prog",
       "prog",
       "CUC",
       "non",
       "annule",
        NULL);
 
   /* Echec de l'execution */
   fprintf(stderr,"Erreur lors de la tentative d'execution du " );
   fprintf(stderr," batch bref_demande_copie \n" );
   break;
  }
 
 case (pid_t) (-1) : /* creation du fils impossible */
    {
      fprintf(stderr,"Execution du batch bref_demande_copie " );
      fprintf(stderr,"impossible (annulation de la demande de copie " );
      fprintf(stderr,"du referentiel CUC non effectuee) \n" );
      break;
    }
 
       default : /* Le processus pere attend le processus fils */
    {
      fprintf(stderr,"Je suis le pere et j'attends le processus fils : %d - Attente......\n", pid);
      pid=wait(etatpere);
      fprintf(stderr,"J'ai fini d'attendre\n" );
      if (WIFEXITED (etat))
      {
       if (WEXITSTATUS(*etatpere) !=0)
       {
         fprintf (stderr,"Echec de la reinitialisation de la " );
         fprintf (stderr,"demande de copie (statut : %d) \n",WEXITSTATUS(*etatpere));
       }
      }
      else
      {
       if (WIFSIGNALED(*etatpere))
       {
         fprintf (stderr,"Signal recu lors de la reinitialisation " );
         fprintf (stderr,"de la demande de copie : %d \n",WTERMSIG(*etatpere));
       }
      }
    }
 }

 
Le problème c'est que j'ai mon fils qui exécute bien le programme voulu mais le processus père reste en attente indéfiniment
 
Quelqu'un aurait-il une idée sur ce problème ?
 
Merci
 


Message édité par sal1 le 10-10-2011 à 11:23:18
Reply

Marsh Posté le 10-10-2011 à 16:13:45    

Du code qui n'est pas formaté n'est jamais agréable à lire. utilise les balises CPP pour te faire un résultat comme ca :

Code :
  1. fprintf(stderr,"Avant fork()\n" );
  2. pid = fork ();   
  3. fprintf(stderr,"pid : %d - Apres fork()\n", pid);
  4. switch (pid)
  5. {
  6.   case (pid_t)0 : /* creation du processus fils */
  7.   {
  8.        fprintf(stderr,"Je suis le fils et je vais lancer mon prog\n" );
  9.        etat=execlp("prog",
  10.        "prog",
  11.        "CUC",
  12.        "non",
  13.        "annule",
  14.         NULL);
  15.    /* Echec de l'execution */
  16.    fprintf(stderr,"Erreur lors de la tentative d'execution du " );
  17.    fprintf(stderr," batch bref_demande_copie \n" );
  18.    break;
  19.   }
  20. case (pid_t) (-1) : /* creation du fils impossible */
  21.     {
  22.       fprintf(stderr,"Execution du batch bref_demande_copie " );
  23.       fprintf(stderr,"impossible (annulation de la demande de copie " );
  24.       fprintf(stderr,"du referentiel CUC non effectuee) \n" );
  25.       break;
  26.     }
  27.        default : /* Le processus pere attend le processus fils */
  28.     {
  29.       fprintf(stderr,"Je suis le pere et j'attends le processus fils : %d - Attente......\n", pid);
  30.       pid=wait(etatpere);
  31.       fprintf(stderr,"J'ai fini d'attendre\n" );
  32.       if (WIFEXITED (etat))
  33.       {
  34.        if (WEXITSTATUS(*etatpere) !=0)
  35.        {
  36.          fprintf (stderr,"Echec de la reinitialisation de la " );
  37.          fprintf (stderr,"demande de copie (statut : %d) \n",WEXITSTATUS(*etatpere));
  38.        }
  39.       }
  40.       else
  41.       {
  42.        if (WIFSIGNALED(*etatpere))
  43.        {
  44.          fprintf (stderr,"Signal recu lors de la reinitialisation " );
  45.          fprintf (stderr,"de la demande de copie : %d \n",WTERMSIG(*etatpere));
  46.        }
  47.       }
  48.     }
  49. }


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

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