Fork n fils de n fils

Fermé
Linquisiteur - 15 févr. 2013 à 01:13
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 - 16 févr. 2013 à 16:28
Bonjour, j'ai un problème en C. j'ai tenter de me lancer dans les forks mais j'ai rencontrer un petit problème avec les fils de fils des fork...
Le but étant un programme donc le père créera N fils qui a leur tour (les fils) créeront n petit-fils.

Je poste ici le code. Je commence a me débrouiller en C mais les forks étant une nouvelle (grosse) étape et je suis un peu perdu (si vous avez de bon tuto au passage ;) )

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>
 
 int main (int argc, char * argv[]){
 
 int nb; 
 puts ("Combien de fils voulez-vous? ");
 scanf ("%d", &nb);
 
 int nbfils; 
 puts ("Combien de fils de fils voulez-vous? ");
 scanf ("%d", &nbfils);
 
 printf ("Nous allons créé %d fils\n", nb);
 printf ("Nous allons créé %d de fils de fils\n", nbfils);
 
 int cpt = 0;
 int cptfils = 0;
  
while (cpt < nb)  // boucle fils
     {
      pid_t a = fork();
       if (a < 0) 
       {   
       perror ("le fork a rate\n");
       exit(EXIT_FAILURE);
       }
       if (a == 0)
       {
       printf("Je suis le fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), a, getppid());
       cptfils = 0;
       while (cptfils < nbfils) // boucle petit fils
       {
               pid_t b = fork();
               if (b < 0) 
               {   
                perror ("le fork du petit-fils a rate\n");
                exit(EXIT_FAILURE);
                }
                if (b == 0)
                {
                printf("Je suis le petit fils de pid %d, a vaut %d, mon pere est %d \n", getpid(), b, getppid());
                exit(0);
                }
                cptfils++;   
       }
       cpt++;
       }
     }         
       
      printf("Je suis le pere de pid %d\n", getpid());
      for(cpt=0;cpt<nb;cpt++)  wait(0);
      for(cptfils=0;cptfils<nbfils;cptfils++)  wait(0);
      exit(EXIT_SUCCESS); 
          
}
A voir également:

3 réponses

up, personne n'a de notion sur les forks? ;)
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 15/02/2013 à 17:13
Tu n'as pas clairement expliqué quel était le problème. Et comme je suis sous Windows je n'ai pas pu tester, mais un des problèmes est je pense ton cpt++
En effet l'incrémentation a lieu pour tous les fils or la boucle ne devrait continuer que pour les pères (tu as pensé à faire un exit(0) pour les petits fils, mais pas pour les fils)

Remarque : je t'invite à faire intervenir cpt et cptfils dans tes affichages, il est plus facile de s'y retrouver dans l'ordre des appels qu'avec les pid.

Rappel : je n'ai pas testé ce code !

int main()
{
    int nb, nbfils, cpt;
    
    printf("Combien de fils voulez-vous ? ");
    scanf("%d", &nb);
    
    printf("Combien de petit-fils voulez-vous (pour chaque fils) ? ");
    scanf ("%d", &nbfils);
    
    for (cpt=0; cpt<nb; cpt++)
    {
        int cptfils;
        pid_t a = fork();
        
        if (a < 0)
        {
            printf("echec du fork cpt=%d err=%d\n",cpt,a);
            return 1;
        }
        else if (a == 0)
        {
            printf("Je suis le fils cpt=%d\n", cpt);
            
            for (cptfils=0; cptfils<nbfils; cptfils++)
            {
                pid_t b = fork();
                
                if (b < 0)
                {
                    printf("echec du fork cpt=%d cptfils=%d err=%d\n",cpt,cptfils,a);
                    return 1;
                }
                else if (b == 0)
                {
                    printf("Je suis un fils de cpt=%d (cptfils=%d)\n", cpt, cptfils);
                    return 0;
                }
                else // b>0
                {
                    printf("Je suis le fils cpt=%d heureux de la naissance de mon fils cptfils=%d\n",cpt,cptfils);
                }
            }
            
            return 0;
        }
        else // a>0
        {
            printf("Je suis le pere, heureux de la naissance de mon fils cpt=%d\n",cpt);
        }
    }
    
    return 0;
}
La confiance n'exclut pas le contrôle
0
merci j'ai tester le programme et j'obtiens ceci comme erreur

exo3.c:14: error: 'pid_t' undeclared (first use in this function)
exo3.c:14: error: (Each undeclared identifier is reported only once
exo3.c:14: error: for each function it appears in.)
exo3.c:14: error: parse error before "a"
exo3.c:16: error: 'a' undeclared (first use in this function)
exo3.c:27: error: parse error before "b"
exo3.c:29: error: 'b' undeclared (first use in this function)
exo3.c:54:2: warning: no newline at end of file


Pourtant dans mes autres exercice je n'ai pas eu a déclarer cela ^^'
J'ai essayer avec main argc... aussi
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
16 févr. 2013 à 16:03
C'est parce qu'il te manque des #include (en particulier celui qui déclare pid_t), moi je me suis limité à écrire la fonction main, mais elle doit s'insérer dans le reste du fichier.
0
merci ^^' je suis bête de pas l'avoir vu.. Je travaillais sur du java a côté et j'ai tester vite fait dessus.

merci bien par contre je me demande quand même à quoi sert les argc,.. car pour le moment je me contente de les utiliser bètement a chaque programme
0
KX Messages postés 16753 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 25 novembre 2024 3 019
Modifié par KX le 16/02/2013 à 16:31
Les argc et argv en C servent à passer des options au programme.

Exemple simple :

int main(int argc, char* argv[])
{
    int i;
    printf("Nombre de valeurs : %d\n",argc);
    for (i=0; i<argc; i++)
        printf("argument %d = %s\n",i,argv[i]);
    return 0;
}

À exécuter pour comprendre :

./monProgramme
./monProgramme option1 option2 option3

C'est également à cela que sert l'args en Java :

public static void main(String[] args)
{
    System.out.printf("Nombre de valeurs : %d\n",args.length);
    for (int i=0; i<args.length; i++)
        System.out.printf("argument %d = %s\n",i,args[i]);
}

À exécuter pour comprendre :

java MaClasse
java MaClasse option1 option2 option3

Remarque : en C, on peut enlever argc et argv si on ne s'en sert pas, et faire simplement int main(), en revanche en Java on est obligé de toujours avoir un tableau, même si on ne s'en sert pas.
0