Langage C : gérer nombre de Fork

Résolu
cucrapock Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -  
 Anthone -
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

Anthone
 
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   Statut Membre Dernière intervention   4
 
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   Statut Contributeur Dernière intervention   1 299
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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   Statut Contributeur Dernière intervention   1 299
 
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   Statut Contributeur Dernière intervention   1 299
 
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 8732 Date d'inscription   Statut Modérateur Dernière intervention   1 526
 
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