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 -
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:
Et je ne comprend pas mais alors pas du tout l'output:
Pourquoi le processus père exécute t'il son code de nouveau?
Cordialement
Jehutyy
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
A voir également:
- Synchronisation de processus.
- Impossible de synchroniser manette wii - Forum Wii
- Processus hôte windows (rundll32) ✓ - Forum Windows
- Synchronisation impossible - Forum Wii
- Synchronisation en pause google - Forum Réseaux sociaux
- Synchronisation agenda google et outlook - Guide
7 réponses
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.
Comme loupius,
Il faut mettre break; dans les "case"... Sinon, le programme continue les autres "case".
Il faut mettre break; dans les "case"... Sinon, le programme continue les autres "case".
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 !
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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?
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 ?