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 :

Problème wait, attente sur mauvais PID


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut Problème wait, attente sur mauvais PID
    Bonjour à tous, je suis actuellement entrain de concevoir une petite épreuve, un challenge, pour un site quelconque.

    Je fais face à un problème un peu bizarre, je m'explique.

    Je crée une relation père/fils.

    Les PIDS respectifs sont connus:
    - le fils connaît bien son PID + celui de son père
    - le père connaît bien son PID + celui de son fils.

    Mais le problème est que je veux que le père se mette en attente de la terminaison de son fils, grace a un wait(&status).

    Normalement, wait() renvoit la valeur de PID du fils, venant juste d'etre terminé.

    Or quand j'affiche ce résultat, j'obtient une mauvaise valeur du PID pour le fils.
    En effet, j'obtient toujours comme résultat du wait : PID du fils + 1.

    Ce qui me dérange énormément, car je voudrais récupérer la valeur du exit() fait par le fils. De ce fait, puisqu'il attend la fin d'un mauvais PID (l'affiche tout du moins), il ne récupère pas la valeur du exit fait par le fils. (grace à WEXITSTATUS(status) )



    Je ne vois vraiment pas pourquoi

    Voici un extrait du code :

    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
     
      int fils;
      fils=fork();
      switch(fils)
      {
        case 0:
          if(fp != NULL)  //juste pour savoir si un descripteur à bien pu être ouvert
          {  
            printf("PID Fils %d, PID de mon pere %d\n",(int)getpid(),(int)getppid());
            exit(entier égal au resultat dun traitement ); // entier = 5 ou 6 pour etre précis
          }
     
          else
          {
           exit(7);
          }
     
          break;
     
     
        case -1:
          printf("Le fork a échoué\n");
          break;
     
     
        default:
          {
            printf("PID Pere %d  PID Fils %d\n",(int)getpid(), fils);
            ret_val = wait(&status);
     
            printf("Valeur de retour du process %d est %04x avec comme indice de terminaison %d \n",ret_val,WEXITSTATUS(status),WIFEXITED(status));
    Et voici un exemple de résultat que j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PID Fils 9096, PID de mon pere 9087
    PID Pere 9087  PID Fils 9096
    Valeur de retour du process 9088 est 0001 avec comme indice de terminaison  1
    On voit bien qu'il me sort une valeur PID fils bidon, donc un code de retour status bidon qui ne varie jamais.

    Merci d'avance

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par coldy Voir le message
    Bonjour à tous, je suis actuellement entrain de concevoir une petite épreuve, un challenge, pour un site quelconque.

    Je fais face à un problème un peu bizarre, je m'explique.

    Je crée une relation père/fils.

    Les PIDS respectifs sont connus:
    - le fils connaît bien son PID + celui de son père
    - le père connaît bien son PID + celui de son fils.

    Mais le problème est que je veux que le père se mette en attente de la terminaison de son fils, grace a un wait(&status).

    Normalement, wait() renvoit la valeur de PID du fils, venant juste d'etre terminé.

    Or quand j'affiche ce résultat, j'obtient une mauvaise valeur du PID pour le fils.
    En effet, j'obtient toujours comme résultat du wait : PID du fils + 1.

    Ce qui me dérange énormément, car je voudrais récupérer la valeur du exit() fait par le fils. De ce fait, puisqu'il attend la fin d'un mauvais PID (l'affiche tout du moins), il ne récupère pas la valeur du exit fait par le fils. (grace à WEXITSTATUS(status) )



    Je ne vois vraiment pas pourquoi

    Voici un extrait du code :

    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
     
      int fils;
      fils=fork();
      switch(fils)
      {
        case 0:
          if(fp != NULL)  //juste pour savoir si un descripteur à bien pu être ouvert
          {  
            printf("PID Fils %d, PID de mon pere %d\n",(int)getpid(),(int)getppid());
            exit(entier égal au resultat dun traitement ); // entier = 5 ou 6 pour etre précis
          }
     
          else
          {
           exit(7);
          }
     
          break;
     
     
        case -1:
          printf("Le fork a échoué\n");
          break;
     
     
        default:
          {
            printf("PID Pere %d  PID Fils %d\n",(int)getpid(), fils);
            ret_val = wait(&status);
     
            printf("Valeur de retour du process %d est %04x avec comme indice de terminaison %d \n",ret_val,WEXITSTATUS(status),WIFEXITED(status));
    Et voici un exemple de résultat que j'obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PID Fils 9096, PID de mon pere 9087
    PID Pere 9087  PID Fils 9096
    Valeur de retour du process 9088 est 0001 avec comme indice de terminaison  1
    On voit bien qu'il me sort une valeur PID fils bidon, donc un code de retour status bidon qui ne varie jamais.

    Merci d'avance
    En première lecture ton code semble bon. Tu utilises bien les bonnes macro etc. Toutefois je l'ai pas encore testé.
    Mais juste pour essai, tu devrais mettre un "sleep(1)" au début du père pour être sûr que le fils se lance en premier et être sûr que tu récupères bien les infos issues de la mort du fils...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut
    Bonjour Sve@r.
    Je viens juste d'ajouter un sleep(2) avant le ret_val = wait

    Mais toujours le même problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PID Fils 3626,  PID de mon pere 3617 //Fils
     
    PID Pere 3617  PID Fils 3626  //Pere
    Valeur de retour du process 3618 est 0001 avec comme indice de terminaison 1
    Si vous voulez, je peux vous envoyer le fichier C complet par MP (ou vous envoyer un pastebin par MP).

    Il y a peut être quelque chose avant, qui provoque cette erreur mais j'en doute.

    Je ne souhaite évidemment pas coller l'intégralité du code ici, ce code est destiné à un challenge

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 472
    Par défaut
    Tu travailles avec quel système d'exploitation ?

    A priori, il s'agit bien d'un effet de bord car quand j'exécute ton programme avec un noyau Linux 2.6.34, tout marche bien, une fois qu'on a fait les adaptations nécessaires (déclarer les variables qui ne sont pas visibles dans l'extrait que tu as posté).

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 830
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 830
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    A priori, il s'agit bien d'un effet de bord car quand j'exécute ton programme avec un noyau Linux 2.6.34, tout marche bien
    Confirmé - Il ne devrait pas y avoir de problème avec cette façon de faire

    Voici mon code
    Code C : 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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/wait.h>
     
    int main()
    {
    	int fils;
    	int code_ret;
    	int status;
     
    	srand(getpid());
    	switch(fils=fork())
    	{
    		case 0: //Fils
    			printf("	Je suis le fils %d\n", getpid());
    			code_ret=random() % 255;
    			printf("	Et je m'arrête avec %d\n", code_ret);
    			exit(code_ret);
     
    		default: //Père
    			printf("Je suis le père %d de %d\n", getpid(), fils);
    			code_ret=wait(&status);
    			printf("Et mon fils %d vient de se terminer avec le code %d\n", code_ret, WEXITSTATUS(status));
    	}
    }

    Et le résultat sous Debian
    moi@debian:~$ ./a
    Je suis le père 2975 de 2976
    Je suis le fils 2976
    Et je m'arrête avec 121
    Et mon fils 2976 vient de se terminer avec le code 121
    moi@debian:~$ ./a
    Je suis le père 2977 de 2978
    Je suis le fils 2978
    Et je m'arrête avec 182
    Et mon fils 2978 vient de se terminer avec le code 182
    moi@debian:~$ ./a
    Je suis le père 2979 de 2980
    Je suis le fils 2980
    Et je m'arrête avec 152
    Et mon fils 2980 vient de se terminer avec le code 152
    moi@debian:~$ ./a
    Je suis le père 2981 de 2982
    Je suis le fils 2982
    Et je m'arrête avec 12
    Et mon fils 2982 vient de se terminer avec le code 12
    moi@debian:~$
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3
    Par défaut
    Merci à tous les 2 pour vos efforts mais le bug est toujours présent.

    Je vous ait envoyé un mp avec lien vers un pastebin où le code complet apparait.

    ps : je suis sous Ubuntu 9.04

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problèmes d'évènements sur ComboBox
    Par bakaneko dans le forum MFC
    Réponses: 3
    Dernier message: 23/02/2004, 08h46
  2. Problème de reqûete sur la date, année et mois en cours
    Par Jean-Marc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/02/2004, 16h36
  3. [CR] Problème de sélection sur un champ date
    Par noluc dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 21/11/2003, 16h56
  4. Problème avec RDTSC sur K6-III
    Par le mage tophinus dans le forum x86 32-bits / 64-bits
    Réponses: 17
    Dernier message: 30/09/2003, 09h43
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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