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
Bonjour,

je bosse sur un programme qui doit envoyer des mails. Je doit pour cela créer plusieurs processus fils mais dans un nombre limité (et c'est bien ça mon problème...). Comment puis-je m'y prendre?

D'avance merci
A voir également:

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

}
4
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
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));
3
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
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()
2
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
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.
2

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
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()
1
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
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??
0
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
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:
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
0