Synchronisation de processus.

jehutyy Messages postés 51 Date d'inscription   Statut Membre Dernière intervention   -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
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   Statut Membre Dernière intervention  
 
Personne?
0
loupius Messages postés 697 Date d'inscription   Statut Membre Dernière intervention   148
 
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   Statut Contributeur Dernière intervention   1 846
 
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   Statut Membre Dernière intervention   4
 
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 1268 Date d'inscription   Statut Membre Dernière intervention   83
 
Quand le processus pere se termine, les fils le suivent automatiquement.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Et les processus orphelins ?
0
jehutyy Messages postés 51 Date d'inscription   Statut Membre Dernière intervention  
 
ah génial merci beaucoup je vais tester ça.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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