[C/Linux]problème de fork wait

Résolu
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 12 janv. 2007 à 15:39
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 15 janv. 2007 à 12:38
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 */
A voir également:

5 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 janv. 2007 à 12:38
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);

}
3
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
12 janv. 2007 à 16:09
Il faut faire une codition if(pid==0) { code du pere} else {code du fils}

http://pwet.fr/man/linux/appels_systemes/wait
++
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
12 janv. 2007 à 16:47
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...
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
12 janv. 2007 à 19:23
Est-on sûr que l'ordre des printf est bien conservé?

_____________________________________
Un éditeur de ressources gratuit pour Windows
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
15 janv. 2007 à 10:07
Avec le sleep de deux secondes dans le client, y a quand même de la marge.
0
Rejoignez-nous