Synchronisation de processus.

Fermé
jehutyy Messages postés 51 Date d'inscription lundi 5 septembre 2011 Statut Membre Dernière intervention 1 mai 2015 - 31 oct. 2012 à 12:45
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 7 nov. 2012 à 20:13
Bonjour à tous,

J'ai écrit un programme dans le but de tester la primitive wait() et waitpid().
Ma première question est donc: ces deux primitives servent elles juste a "attendre" un processus fils ou peuvent elles servir a bloquer un fils en attendant la terminaison d'un père?

Et deuxièmement j'ai écrit ce programme:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(int argc, char **argv){
pid_t pid;
int status;

switch(pid=fork()){
	case -1: perror("fork\n");
		 exit(1);
	case 0:waitpid(getppid(), &status, 0);
		printf("je suis le fils %d, mon pere est %d\n", getpid(), getppid());
		printf("fin du fils\n");
	default: 
		 printf("je suis le pere %d\n", getpid());
		 printf("fin du pere\n");
};
}


Et je ne comprend pas mais alors pas du tout l'output:
je suis le pere 13220
fin du pere
je suis le fils 13221, mon pere est 13220
fin du fils
je suis le pere 13221
fin du pere


Pourquoi le processus père exécute t'il son code de nouveau?

Cordialement
Jehutyy

7 réponses

jehutyy Messages postés 51 Date d'inscription lundi 5 septembre 2011 Statut Membre Dernière intervention 1 mai 2015
2 nov. 2012 à 22:29
Personne?
0
loupius Messages postés 697 Date d'inscription dimanche 1 novembre 2009 Statut Membre Dernière intervention 31 décembre 2017 148
2 nov. 2012 à 23:06
Moi, avec tout le respect que je te dois, j'aurais plutôt écrit ceci:
int main(int argc, char *argv[])
{
  pid_t pid;
  int status;

  switch (pid=fork())
  {
    case -1:
      perror("fork\n");
      exit(1);
    case 0:
      waitpid(getppid(), &status, 0);
      printf("je suis le fils %d, mon pere est %d\n", getpid(), getppid());
      printf("fin du fils\n");
      break;
    default: 
      printf("je suis le pere %d\n", getpid());
      printf("fin du pere\n");
  }
  return EXIT_SUCCESS;
}
Bonne devinette et bonne continuation.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
2 nov. 2012 à 23:23
Comme loupius,
Il faut mettre break; dans les "case"... Sinon, le programme continue les autres "case".
0
ngounou25 Messages postés 96 Date d'inscription mercredi 6 août 2008 Statut Membre Dernière intervention 5 juillet 2013 4
3 nov. 2012 à 22:45
Pour ton code source, tu as la réponse ;-)

Pour ce qui est de la primitive "wait", elle est adressé au père, et non pas au fils. Tu ne pourais donc pas demander à un fils d'attendre que son père se termine d'abord !
0

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

Posez votre question
armasousou Messages postés 1267 Date d'inscription dimanche 16 août 2009 Statut Membre Dernière intervention 30 décembre 2016 83
4 nov. 2012 à 11:44
Quand le processus pere se termine, les fils le suivent automatiquement.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
4 nov. 2012 à 12:05
Et les processus orphelins ?
0
jehutyy Messages postés 51 Date d'inscription lundi 5 septembre 2011 Statut Membre Dernière intervention 1 mai 2015
7 nov. 2012 à 17:05
ah génial merci beaucoup je vais tester ça.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
7 nov. 2012 à 20:13
Voici ce qu'indique le man :
http://pwet.fr/man/linux/appels_systemes/wait/

La fonction wait suspend l'exécution du processus courant jusqu'à ce qu'un enfant se termine, ou jusqu'à ce qu'un signal à intercepter arrive. Si un processus fils s'est déjà terminé au moment de l'appel (il est devenu "zombie"), la fonction revient immédiatement. Toutes les ressources utilisées par le fils sont libérées.

La fonction waitpid suspend l'exécution du processus courant jusqu'à ce que le processus fils numéro pid se termine, ou jusqu'à ce qu'un signal à intercepter arrive. Si le fils mentionné par pid s'est déjà terminé au moment de l'appel (il est devenu "zombie"), la fonction revient immédiatement. Toutes les ressources utilisées par le fils sont libérées.

La valeur de pid peut également être l'une des suivantes :

< -1
attendre la fin de n'importe quel processus fils appartenant à un groupe de processus d'ID pid.
-1
attendre la fin de n'importe quel fils. C'est le même comportement que wait.
0
attendre la fin de n'importe quel processus fils du même groupe que l'appelant.
> 0
attendre la fin du processus numéro pid.

Cela répond à ta question, non ?
0