Synchronisation de processus.

jehutyy Messages postés 57 Statut Membre -  
fiddy Messages postés 11653 Statut Contributeur -
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 57 Statut Membre
 
Personne?
0
loupius Messages postés 789 Statut Membre 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 11653 Statut Contributeur 1 847
 
Comme loupius,
Il faut mettre break; dans les "case"... Sinon, le programme continue les autres "case".
0
ngounou25 Messages postés 110 Statut Membre 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 1351 Statut Membre 83
 
Quand le processus pere se termine, les fils le suivent automatiquement.
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
Et les processus orphelins ?
0
jehutyy Messages postés 57 Statut Membre
 
ah génial merci beaucoup je vais tester ça.
0
fiddy Messages postés 11653 Statut Contributeur 1 847
 
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