Langage C : gérer nombre de Fork
Résolu/Fermé
cucrapock
Messages postés
16
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 mai 2007
-
17 juil. 2006 à 16:37
Anthone - 5 nov. 2007 à 22:36
Anthone - 5 nov. 2007 à 22:36
A voir également:
- Langage C : gérer nombre de Fork
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Delphi (langage) - Télécharger - Langages
6 réponses
Voila celle apris en cours
switch(fork())
{
case -1 : perror("Probleme fork); exit(1);
case 0: //tu es dans le fils fais ce que tu veux
exit(1);
default : //tu es dans le pere fait ce que tu veux
}
switch(fork())
{
case -1 : perror("Probleme fork); exit(1);
case 0: //tu es dans le fils fais ce que tu veux
exit(1);
default : //tu es dans le pere fait ce que tu veux
}
cucrapock
Messages postés
16
Date d'inscription
vendredi 18 novembre 2005
Statut
Membre
Dernière intervention
12 mai 2007
4
8 août 2006 à 12:02
8 août 2006 à 12:02
Voila un algo permettant de créer à partir d'un processu père nb_proc processus fils
do {
essai=0;
do {
pid = fork();
essai ++;
} while ((pid == -1)&&(essai<100));
if (essai!=100 && pid!=0) {
num_proc++;
}
else if (pid==0) {
/* Traitement du fils */
/* ..........................*/
/* On termine le processus fils */
pid=getpid();
_exit(pid);
}
} while ((pid!=0) && (num_proc<=nb_proc));
do {
essai=0;
do {
pid = fork();
essai ++;
} while ((pid == -1)&&(essai<100));
if (essai!=100 && pid!=0) {
num_proc++;
}
else if (pid==0) {
/* Traitement du fils */
/* ..........................*/
/* On termine le processus fils */
pid=getpid();
_exit(pid);
}
} while ((pid!=0) && (num_proc<=nb_proc));
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
17 juil. 2006 à 16:42
17 juil. 2006 à 16:42
salut.
Si je me souvien bien, fork() retourne le numéro du processus.
Donc, tu fait int pro=fork()
ensuite, dans le processus fil, si pro>n, tu ne lance pas de fork()
Si je me souvien bien, fork() retourne le numéro du processus.
Donc, tu fait int pro=fork()
ensuite, dans le processus fil, si pro>n, tu ne lance pas de fork()
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
17 juil. 2006 à 17:35
17 juil. 2006 à 17:35
Salut,
Je ne pense que ça fonctionnera.
A priori le pid du processus fils n'est pas le nombre qui représente le nombre cardinal du énième processus créé par le parent mais le vrai pid du fils (qui peut se trouver dans les milliers)...
Vaudrait mieux une variable compteur qui s'incrémente à chaque appel de fork.
Je ne pense que ça fonctionnera.
A priori le pid du processus fils n'est pas le nombre qui représente le nombre cardinal du énième processus créé par le parent mais le vrai pid du fils (qui peut se trouver dans les milliers)...
Vaudrait mieux une variable compteur qui s'incrémente à chaque appel de fork.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
20 juil. 2006 à 09:04
20 juil. 2006 à 09:04
Salut.
Il me semblai bien que tu distinguait le pere du fils avec ce que renvoi fork().
J'ai pas remis la main dessus, mais j'avais vu un exemple ou pid était le nom du père. Ainsi, pid==0 le père , pid==1 le fils, pid==2 le deuxième fils etc...
Sinon, je n'ai pas bien compris ton histoire d'état d'âme sur le fork et le pid. au moment où tu invoque fork, il est fait une copie exact du processus, dans l'original fork retourne "PID_PERE" dans le second processus il retourne "PID_FILS". Ensuite dans chaque processus, tout se passe séparemment, et linéairement jusqu'au prochain apel à fork()
Il me semblai bien que tu distinguait le pere du fils avec ce que renvoi fork().
J'ai pas remis la main dessus, mais j'avais vu un exemple ou pid était le nom du père. Ainsi, pid==0 le père , pid==1 le fils, pid==2 le deuxième fils etc...
Sinon, je n'ai pas bien compris ton histoire d'état d'âme sur le fork et le pid. au moment où tu invoque fork, il est fait une copie exact du processus, dans l'original fork retourne "PID_PERE" dans le second processus il retourne "PID_FILS". Ensuite dans chaque processus, tout se passe séparemment, et linéairement jusqu'au prochain apel à fork()
Char Snipeur
Messages postés
9813
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
3 octobre 2023
1 298
19 juil. 2006 à 08:08
19 juil. 2006 à 08:08
exact.
En fait, j'ai vue l'exemple d'un programme qui utilisait ça.
Mais dans ma mémoire j'ai peut être confondu avec un thread.
Comment fait - on alors pour savoir si on est dans le processus père ou fils??
En fait, j'ai vue l'exemple d'un programme qui utilisait ça.
Mais dans ma mémoire j'ai peut être confondu avec un thread.
Comment fait - on alors pour savoir si on est dans le processus père ou fils??
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
20 juil. 2006 à 03:57
20 juil. 2006 à 03:57
Comment fait - on alors pour savoir si on est dans le processus père ou fils??
C'est justement une bizzarerie que je n'arrive jamais à me représenter dans son fonctionnement.
Comme décris dans le man fork(2)
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/fork.2.html
Le truc est assez simple, on fait un appel à fork qui retourne un pid.
Et c'est là que c'est bizzare: si le pid est égal à 0, on est dans le processus fils, on doit donc executer les instructions propres au fils, et si le pid est supérieur à zero, on est dans le processus père et on doit donc prévoir les instructiions en conséquence.
Voilà ce que ça donne dans l'exemple donné par le lien donné plus haut:
Moi ce truc ça me chiffonne. Le code est sensé être executé de façon linéaire, et là les deux blocs conditionnels corrects sont vérifiés, c'est à dire que tantôt pid ==0 et tantôt pid > 0. Si tu fais une boucle infinie de printf sur ce pid, tu verras que sa valeur change de zero à un autre nombre supérieur à zero.
Normalement si pid == valeur (même si valeur varie de temps en temps) alors seul le bloc conditionnel correspondant à la valeur actuelle sera executé. Les autres seront ignorés. Ca c'est du code linéaire traditionnel. Mais ici pid varie et en plus ses deux valeurs sont prises en compte dans le bloc de conditions...
C'est un mystère pour moi ce truc :-s
C'est justement une bizzarerie que je n'arrive jamais à me représenter dans son fonctionnement.
Comme décris dans le man fork(2)
http://www.linux-kheops.com/doc/man/manfr/man-html-0.9/man2/fork.2.html
Le truc est assez simple, on fait un appel à fork qui retourne un pid.
Et c'est là que c'est bizzare: si le pid est égal à 0, on est dans le processus fils, on doit donc executer les instructions propres au fils, et si le pid est supérieur à zero, on est dans le processus père et on doit donc prévoir les instructiions en conséquence.
Voilà ce que ça donne dans l'exemple donné par le lien donné plus haut:
pid_t pid; pid = fork (); if (pid > 0) { /* Processus père */ } else if (pid == 0) { /* Processus fils */ } else { /* Traitement d'erreur */ }
Moi ce truc ça me chiffonne. Le code est sensé être executé de façon linéaire, et là les deux blocs conditionnels corrects sont vérifiés, c'est à dire que tantôt pid ==0 et tantôt pid > 0. Si tu fais une boucle infinie de printf sur ce pid, tu verras que sa valeur change de zero à un autre nombre supérieur à zero.
Normalement si pid == valeur (même si valeur varie de temps en temps) alors seul le bloc conditionnel correspondant à la valeur actuelle sera executé. Les autres seront ignorés. Ca c'est du code linéaire traditionnel. Mais ici pid varie et en plus ses deux valeurs sont prises en compte dans le bloc de conditions...
C'est un mystère pour moi ce truc :-s