Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 28/05/2006, à 14:01

Premium

[C] Lancement de plusieurs processus

Bonjour,

je suis débutant en programmation systeme, je sollicite votre aide pour m'aider à écrire le main de mon programme.
Pour l'écriture du programme, il faut uniquement que j'utilise des fork, pipe... car je n'ai pas vu les threads...

J'explique ce qu'il faut faire :

-avoir plusieurs traceroute s'effectuant simultanément, afin de rassembler des informations le plus vite possible
-pouvoir choisir à la volée combien de traceroute on souhaite exécuter en parallèle)
-ajouter de nouvelles « cibles » pour traceroute pendant que l'ensemble fonctionne.

Les résultats des traceroute (avec l'option -n) lancés doivent être écrits dans un fichier pour pouvoir analyser les lignes et ainsi créer un graphe.

Le parsing et la création du graphe ont été faits, c'est le lancement des traceroutes et l'écriture dans le fichier qui pose problème.

Voici ce que j'ai écrit. Il n'est pas complet et aimerait que vous m'aidez pour faire en sorte qu'il le soit.

Merci par avance

// structure pour gérer une info fils => père
typedef struct {
  info1;
  info2;
  info3;
  info4;
  //...les infos qu'il faut
} t_info;

// structure pour gérer un fils et son pipe
typedef struct {
  int cote[2];               // Cotés du pipe
  int pid;                  // PID du fils
} t_fils;

int main(void)
{
  t_fils tabFils[n];           // Tableau des fils
  int i;                           // Boucle
  int nbFils;                   // Nb fils vivants
  t_info info;                  // Info transmise
  
  // Création des processus
  for (i=0; i < n; i++)
    {
      // Ouverture du pipe pour le fils vers son père
      pipe(tabFils[i].cote);
      
      // Création du processus fils
      if ((tabFils[i].pid=fork()) == 0)
    {
      // Ici on est dans le fils "i"
      
      // On commence par fermer le coté de lecture inutile
      close(tabFils[i].cote[0]);
      
      // Traceroute vers ip X
      //...
      
      // Récupération de toutes les IP situées entre moi et "x" => tableau d'IP
      //..
      
      //  Transmission de ce tableau vers le père par le pipe
      for (//...)
      {
        // Remplissage infos (une des info pourrait être le n° du fils)
        info.info1=i;
        info.info2=//...
          //... (on remplit toutes les infos)
          
          // On envoie l'info au père
          write(tabFils[i].cote[1], &info, sizeof(info);
            
         // on envoie une info particulière signifiant "fini"
         write(tabFils[i].cote[1], "EOT", 4);
            
        // Toutes les Ip sont transmises - Fin du fils (mais fermeture pipe avant)
        close(tabFils[i].cote[1]);
        exit(0);
      }
        
      // Ici on est dans le père - On n'a rien à faire sauf à fermer le coté d'écriture inutile
    close(tabFils[i].cote[1]);
    }
 
        // Ici, tous les fils sont lancés - On scrute maintenant les pipes tant qu'il y a des fils
        nbFils=n;
      while (nbFils > 0)
      {
        // On lit tous les pipes des fils
        for (i=0; i < n; i++)
          {
        // Si le fils "i" n'existe plus on le saute
        if (tabFils[i].pid == 0)
          continue;
        
        // Lecture du pipe venant du fils "i"
        if (read(tabFils[i].cote[0], &info,  sizeof(info)) > 0)
          {
            // Si on a reçu l'info particulière "EOT"
            if (//... == "EOT")
            {
              // On ferme le pipe de ce fils
              close(tabFils[i].cote[0]);
              
              // Le fils a terminé => pid mis à 0 (permettra de ne plus le traiter)
              tabFils[i].pid=0;
              
              // Un fils en moins
              nbFils--;
              
              // Inutile d'en faire plus pour ce crevard
              continue;
            }
            
            // Ici, on a reçu les infos sur les IP pour le fils "i"
            //... => on les analyse et on construit le graphe
         }
            
        // ici, soit on n'a rien reçu, soit on a fini de traiter les infos => on reboucle sur le fils suivant
            sleep(1);
   }
}
// Ici, il n'y a plus de fils

}

Dernière modification par Premium (Le 28/05/2006, à 14:02)

Hors ligne

#2 Le 29/05/2006, à 21:23

Premium

Re : [C] Lancement de plusieurs processus

Salut,

j'ai un peu modifié le code précédent.

Si quelqu'un pouvait m'aider, svp pour avoir un code compilable?

Merci

void traite_fils(t_info* info, t_fils* tuyau) {
    for (i=0; i < n; i++) {
         // Traceroute vers ip X
      //...
      
      // Récupération de toutes les IP situées entre moi et "x" => tableau d'IP
      //..
      
      //  Transmission de ce tableau vers le père par le pipe
      for (//...)
      {
        // Remplissage infos (une des info pourrait être le n° du fils)
        info->info1=i;
        info->info2=//...
          //... (on remplit toutes les infos)
          
          // On envoie l'info au père
          write(tuyau->cote[1], info, sizeof(*info);
            
         // on envoie une info particulière signifiant "fini"
         write(tuyau->cote[1], "EOT", 4);
            
        // Toutes les Ip sont transmises - Fin du fils (mais fermeture pipe avant)
        close(tuyau->cote[1]);
        exit(0);
    }
}

int main(void)
{
  t_fils tabFils[n];           // Tableau des fils
  int i;                           // Boucle
  int nbFils;                   // Nb fils vivants
  t_info info;                  // Info transmise
  
  // Création des processus
  for (i=0; i < n; i++)
    {
      // Ouverture du pipe pour le fils vers son père
      if (pipe(tabFils[i].cote) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
      }
      
      // Création du processus fils
      tabFils[i].pid = fork();
      switch (tabFils[i].pid)
    {
        case -1:
            perror("fork");
            exit(EXIT_FAILURE);
        case 0:  // Ici on est dans le fils "i"  
            // On commence par fermer le coté de lecture inutile
            close(tabFils[i].cote[0]);
            traite_fils(&info,&tabFils[i]);
            break;
        default:
            // Ici on est dans le père - On n'a rien à faire sauf à fermer le coté d'écriture inutile    
            close(tabFils[i].cote[1]);
            break;
    }
 

  // on est sur d'etre dans le pere...
 
 
        // Ici, tous les fils sont lancés - On scrute maintenant les pipes tant qu'il y a des fils
        nbFils=n;
      while (nbFils > 0)
      {
        // On lit tous les pipes des fils
        for (i=0; i < n; i++)
          {
        // Si le fils "i" n'existe plus on le saute
        if (tabFils[i].pid == 0)
          continue;
        
        // Lecture du pipe venant du fils "i"
        if (read(tabFils[i].cote[0], &info,  sizeof(info)) > 0)
          {
            // Si on a reçu l'info particulière "EOT"
            if (//... == "EOT")
            {
              // On ferme le pipe de ce fils
              close(tabFils[i].cote[0]);
              
              // Le fils a terminé => pid mis à 0 (permettra de ne plus le traiter)
              tabFils[i].pid=0;
              
              // Un fils en moins
              nbFils--;
              
              // Inutile d'en faire plus pour ce crevard
              continue;
            }
            
            // Ici, on a reçu les infos sur les IP pour le fils "i"
            //... => on les analyse et on construit le graphe
         }
            
        // ici, soit on n'a rien reçu, soit on a fini de traiter les infos => on reboucle sur le fils suivant
            sleep(1);
   }
}
// Ici, il n'y a plus de fils

}

Hors ligne

#3 Le 29/05/2006, à 22:21

NicoA380

Re : [C] Lancement de plusieurs processus

Premium a écrit :

Si quelqu'un pouvait m'aider, svp pour avoir un code compilable?

Ça compile, mais pas plus, vu que le programme n'est pas complet tongue

Je n'ai pas le temps d'aider plus que ça, j'ai moi même un (moulte) projet(s) à finir(commencer) !!

#include "unistd.h"
#include "stdlib.h"
#include "stdio.h"
#define n 4
typedef int info;

// structure pour gérer une info fils => père
typedef struct {
  info info1;
  info info2;
  info info3;
  info info4;
  //...les infos qu'il faut
} t_info;

// structure pour gérer un fils et son pipe
typedef struct {
  int cote[2];               // Cotés du pipe
  int pid;                  // PID du fils
} t_fils;



void traite_fils(t_info* info, t_fils* tuyau) {
    for (int i=0; i < n; i++) {
         // Traceroute vers ip X
      //...
      
      // Récupération de toutes les IP situées entre moi et "x" => tableau d'IP
      //..
      
      //  Transmission de ce tableau vers le père par le pipe
      for (;;)//...)
      {
        // Remplissage infos (une des info pourrait être le n° du fils)
        info->info1=i;
        info->info2=//...
          //... (on remplit toutes les infos)
          
          // On envoie l'info au père
          write(tuyau->cote[1], info, sizeof(*info));
            
         // on envoie une info particulière signifiant "fini"
         write(tuyau->cote[1], "EOT", 4);
            
        // Toutes les Ip sont transmises - Fin du fils (mais fermeture pipe avant)
        close(tuyau->cote[1]);
        exit(0);
			}
    }
}

int main()
{
  t_fils tabFils[n];           // Tableau des fils
  int i;                           // Boucle
  int nbFils;                   // Nb fils vivants
  t_info info;                  // Info transmise
  
  // Création des processus
  for (i=0; i < n; i++)
    {
      // Ouverture du pipe pour le fils vers son père
      if (pipe(tabFils[i].cote) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
      }
      
      // Création du processus fils
      tabFils[i].pid = fork();
      switch (tabFils[i].pid)
    {
        case -1:
            perror("fork");
            exit(EXIT_FAILURE);
        case 0:  // Ici on est dans le fils "i"  
            // On commence par fermer le coté de lecture inutile
            close(tabFils[i].cote[0]);
            traite_fils(&info,&tabFils[i]);
            break;
        default:
            // Ici on est dans le père - On n'a rien à faire sauf à fermer le coté d'écriture inutile    
            close(tabFils[i].cote[1]);
            break;
    }
 

  // on est sur d'etre dans le pere...
 
 
        // Ici, tous les fils sont lancés - On scrute maintenant les pipes tant qu'il y a des fils
        nbFils=n;
      while (nbFils > 0)
      {
        // On lit tous les pipes des fils
        for (i=0; i < n; i++)
          {
        // Si le fils "i" n'existe plus on le saute
        if (tabFils[i].pid == 0)
          continue;
        
        // Lecture du pipe venant du fils "i"
        if (read(tabFils[i].cote[0], &info,  sizeof(info)) > 0)
          {
            // Si on a reçu l'info particulière "EOT"
            if (true)//... == "EOT")
            {
              // On ferme le pipe de ce fils
              close(tabFils[i].cote[0]);
              
              // Le fils a terminé => pid mis à 0 (permettra de ne plus le traiter)
              tabFils[i].pid=0;
              
              // Un fils en moins
              nbFils--;
              
              // Inutile d'en faire plus pour ce crevard
              continue;
            }
            
            // Ici, on a reçu les infos sur les IP pour le fils "i"
            //... => on les analyse et on construit le graphe
         }
            
        // ici, soit on n'a rien reçu, soit on a fini de traiter les infos => on reboucle sur le fils suivant
         sleep(1);
   		}
		}
// Ici, il n'y a plus de fils

	}
}

Hors ligne

#4 Le 29/05/2006, à 23:33

Premium

Re : [C] Lancement de plusieurs processus

Salut,

est-ce que quelqu'un pourrait m'indiquer à quel momment dans le code lancé les traceroute ainsi que le fait de mettre le résultat dans un fichier car je doit le parser pour créer le graphe.

la fonction de parsing à ce prototype char **Parsing(FILE *fichier) et la création du graphe CreerGraphe(char **tab)

Hors ligne

#5 Le 30/05/2006, à 15:03

gene69

Re : [C] Lancement de plusieurs processus

-> tu lances tes traceroutes au debut.

-> tu attends qu'ils aient tous finis

-> ya pas de mystère.

Tu dois rendre ton tp dans combien de temps? neutral


Quand le berger est lâche, le loup chie de la laine.
A (draft) guide to UFO Alien-Invasion

Hors ligne