IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

erreur au retour de waitpid


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut erreur au retour de waitpid
    Le but de l'exo est que le père cree deux fils et se mette en attente de la fin des fils.

    Les fils eux :
    - s'endorment une durée aléatoire.
    - se terminent

    Quand les 2 fils sont terminés, le père affiche la durée d'exécution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    /***************************************************************************
     *   Ennoncé de l'exercice :                                               *
     *      Un père créé deux processus fils et attend leur fin.               *
     *      Chaqu'un de ces deux fils s'endort une durée aléatoire             *
     *      puis se termine.                                                   *
     *                                                                         *
     *      Lorsque les deux fils ont terminé, le père affiche la durée        *
     *      d'exécution totale                                                 *
     *                                                                         *
     ***************************************************************************/
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/wait.h>
     
    int alea(int n);
     
    int main(void)
    {
     
      time_t heureDebut, heureFin;
      pid_t pidFils1, pidFils2;
      int pid_retour,status;
      int attenteFils1,attenteFils2;
     
      srand((int)time(NULL));
      attenteFils1=alea(30);
      attenteFils2=alea(30);
      time(&heureDebut);
      printf("la date et l'heure de debut sont : %s\n", ctime(&heureDebut));
      printf("Lancement du fils 1\n");
     
    /* Le père fork une 1ère fois */
     
      switch (pidFils1=fork())
      {
         case -1 :
            perror("erreur fork ");
            exit(1);
            break;
     
         case 0 :
            printf ("Je suis le processus fils 1 mon pid est %d je vais attendre %d secondes\n",getpid(),attenteFils1);
            sleep(attenteFils1);
            printf ("\n***************Fin du fils 1 ***************************************************");
            exit(0);
     
         default :
            printf ("Je suis le pere mon pid est %d \n",getpid());
      }
     
    /* Le père fork une 2ème fois */
     
      printf("Lancement du fils 2\n");
      switch(pidFils2=fork())
      {
         case -1 :
            perror("erreur fork ");
            exit(1);
            break;
     
         case 0 :
           printf ("Je suis le processus fils 2 mon pid est %d je vais attendre %d secondes\n",getpid(),attenteFils2);
           sleep(attenteFils2);
           printf ("\n***************Fin du fils 2 ***************************************************");
           exit(0);
     
         default :
           /* On attend le fils qui termine en premier par un wait on récupère son pid */
           pid_retour=wait(&status);
           printf("Fin du wait numero 1 valeur de retour %d \n",pid_retour);
           perror("Pb lors du retour ");
     
           /* On attend le 2ème fils, on ne peut pas faire à nouveau un wait, on utilise donc un waitpid en lui donnant
              en 1er argument le pid du fils qui n'est pas terminé */
     
           if (pid_retour==pidFils1) {
    	  pid_retour=waitpid(pidFils2,&status,0);
    	  printf("Fin du wait numero 2 valeur de retour %d \n",pid_retour);
    	  perror("Pb lors du retour ");
           }
     
           else {
              pid_retour=waitpid(pidFils1,&status,0);
    	  printf("Fin du wait numero 2 valeur de retour %d \n",pid_retour);
    	  perror("Pb lors du retour ");
           }
     
         /* Affichage du temps écoulé depuis le début pour faire joli !!! */
         time (&heureFin);
         printf ("\nMes fils ont terminés il est : %s%d secondes se sont ecoulees depuis le debut\n",ctime(&heureFin),(heureFin-heureDebut));
         exit(0);
      }
     
      return EXIT_SUCCESS;
    }
     
    int alea(int n)
    {
       int partSize   = (n == RAND_MAX) ?        1 : 1 + (RAND_MAX - n)/(n+1);
       int maxUsefull = partSize * n + (partSize-1);
       int draw;
     
       do
       {
          draw = rand();
       } while (draw > maxUsefull);
       return draw/partSize;
    }
    Le programme fonctionne sauf que lors du retour du waitpid une erreur est détectée : illegal seek.

    Je vous met la sortie du programme :

    la date et l'heure de debut sont : Sun Dec 23 15:31:20 2007

    Lancement du fils 1
    Je suis le processus fils 1 mon pid est 5297 je vais attendre 7 secondes
    Je suis le pere mon pid est 5296
    Lancement du fils 2
    Je suis le processus fils 2 mon pid est 5298 je vais attendre 21 secondes

    ***************Fin du fils 1 ***************************************************
    Fin du wait numero 1 valeur de retour 5297
    Pb lors du retour : Success

    ***************Fin du fils 2 ***************************************************
    Fin du wait numero 2 valeur de retour 5298
    Pb lors du retour : Illegal seek

    Mes fils ont terminés il est : Sun Dec 23 15:31:41 2007
    21 secondes se sont ecoulees depuis le debut
    Appuyez sur la touche « Entrée » pour continuer !


    Je ne comprends d'ou vient cette erreur.

    Merci par avance!

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Bonjour,

    cette erreur vient quand tu fais appel à perror() deux fois d'affilée, ça n'a rien à voir avec waitpid.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    OK merci je regarde dans cette direction. J'aurai jamais trouvé tout seul!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut
    Merci c'etait bien ça.
    Ca m'apprendra à utiliser une fonction sans lire le man

  5. #5
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    moi aussi je l'ai appris aujourd'hui

Discussions similaires

  1. Valeur d'erreur de retour
    Par lesanglier dans le forum Langage
    Réponses: 3
    Dernier message: 12/11/2010, 18h08
  2. Erreur c4172, retour temporaire
    Par deathness dans le forum Langage
    Réponses: 4
    Dernier message: 07/06/2010, 12h32
  3. [AC-2003] Gérer les erreurs en retour d'une requête
    Par denisw95 dans le forum VBA Access
    Réponses: 3
    Dernier message: 06/10/2009, 13h58
  4. Erreur 403: retour à la page login
    Par Edta dans le forum JSF
    Réponses: 5
    Dernier message: 24/08/2009, 16h35
  5. Erreur en retour d'un appel à un WebService
    Par Marsupilami_00 dans le forum Services Web
    Réponses: 1
    Dernier message: 27/11/2008, 16h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo