[C/Linux]problème de fork wait [Résolu]

Signaler
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
-
Bonjour,


Le code en fin du message produit la sortie suivante :


Creation du fils

debut attente du fils

fin de l'attente du fils

Fin du fils


Alors que le père devrait attendre le fils.


Mais où est le problème svp ?


=============================================

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <sys/types.h>

#include <sys/wait.h>

#include

#include <errno.h>

#include <signal.h>


int main(argc,argv)

{

  int status;

  pid_t pid;


  printf("Creation du fils\n");

  pid = fork();

 

  if (pid < 0)

  {

    perror("Fork failed\n");

    exit(errno);

  }

  else if (pid != 0)

  {

    sleep(2);  /* On fait durer un peu le fils */

    printf("Fin du fils\n");

    exit(0);

  }


  printf("debut attente du fils\n");

  wait(&status);

  printf("fin de l'attente du fils\n");


  exit(0);


} /* Fin du main */

5 réponses

Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
J'ai été sauvé par mon binôme (Qui est moche soi dit en passant).


Extrait du man de fork :

       On success, the PID of the child process is returned  in  the  parent's

       thread  of execution, and a 0 is returned in the child's thread of exe-

       cution.  On failure, a -1 will be returned in the parent's context,  no

       child process will be created, and errno will be set appropriately.


C'est marrant comme tout le monde est tenté de penser que le pid de zéro est pour le père. Ca m'apprendra à lire les pages de man .


Donc le bon code était :


int main(argc,argv)

{

  int status;

  pid_t pid;


  printf("Creation du fils\n");

  pid = fork();

 

  if (pid < 0)

  {

    perror("Fork failed\n");

    exit(errno);

  }

  else if (pid == 0)

  {

    sleep(2);  /* On fait durer un peu le fils */

    printf("Fin du fils\n");

    exit(0);

  }


  printf("debut attente du fils\n");

  wait(&status);


  printf("fin de l'attente du fils\n");


  exit(0);

}
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
21
Il faut faire une codition if(pid==0) { code du pere} else {code du fils}

http://pwet.fr/man/linux/appels_systemes/wait
++
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Merci pour cette réponse rapide, mais j'ai fait :


if ( pid != 0 ) { code du fils; exit(0); }  code du père


Donc c'est équivalent. Le problème est ailleurs...
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Est-on sûr que l'ordre des printf est bien conservé?

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
13
Avec le sleep de deux secondes dans le client, y a quand même de la marge.