IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

lancer une commande se trouvant dans un fichier texte


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut lancer une commande se trouvant dans un fichier texte
    hello tout le monde.
    mon probleme: lancer en parallele (avec l'utilisation de processus fils ) 4commandes à la fois. ces commandes etant inscrites dans un fichier texte.

    au debut mon idée etait de :
    1.faire une lecture du fichier
    2.recuperer chaque ligne dans un tableau tampon et utiliser la fonction execv()
    quelqu'un aurait il une idée plus simple.

    voici mon 'code'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <sys/types.h> 
    #include <sys/stat.h> 
    #include <fcntl.h> 
    #include <unistd.h> 
    #include <stdlib.h> 
    #include <stdio.h> 
    #define BUFFSIZE 4096
     
    #define LINE_LIMIT 512
    #define PROCESS_LIMIT 4
    #define PARAMETER_LIMIT 10
    #define COMMAND_LIMIT 100
    main()
    {
     char tampon1[LINE_LIMIT];
     char tampon2[LINE_LIMIT];
     char tampon3[LINE_LIMIT];
     char tampon4[LINE_LIMIT];
     char tampon5[LINE_LIMIT];
     char tampon6[LINE_LIMIT];
     char tampon7[LINE_LIMIT];
     char tampon8[LINE_LIMIT];
     char tampon9[LINE_LIMIT];
     char tampon10[LINE_LIMIT];
     char tampon11[LINE_LIMIT];
     char tampon12[LINE_LIMIT];
     char tampon13[LINE_LIMIT];
     char tampon14[LINE_LIMIT];
     char tampon15[LINE_LIMIT];
     
     int filedes,nbline=0,nb_charlu,i;
     char BUFF[BUFFSIZE];
     
    /*On va ouvrir le fichier qui contient noos processus*/
    	filedes = open("/home/Documents/Programation/monfic.txt",O_RDONLY,0);
     
     
    /*Nous allons à present chercher le nombre de lignes dans notre fichier texte equivalant alors au nombre de commandes à executer*/
    while((nb_charlu=(read(filedes,BUFF,BUFFSIZE)))>0)/*Le 0 pour dire tant qu'on est pas à la fin du fichier on continue la lecture*/
           {
     
    	for(i=0;i<=nb_charlu;i++)
    		{
     
                      if(BUFF[i]=='\n')
    		      {	
     
                           nbline = nbline + 1;
     
    		      }		
    		}
     
           }
     
    /* On teste si le fichier respecte bien la constante COMMAND_LIMIT = 100*/
    	if(nbline > COMMAND_LIMIT)
    			{
    				printf("ATTENTION trop de commandes dans ce fichier!!!!!\n");
    			}
    	else
     
    				printf("Fichier OK et %d à executer dans le fichier\n",nbline);
     
    /*ESSAYons a present de mettre chaque commande à executer dans un tableau commande_i_[]*/ ?????????????????????????????????????????????????????
    while((nb_charlu=(read(filedes,BUFF,BUFFSIZE)))>0)/*Le 0 pour dire tant qu'on est pas à la fin du fichier on continue la lecture*/
           {

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    moi je ferais plutôt comme celà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #define LINE_LIMIT 512
    #define MAX_LINE 15
    #define PROCESS_LIMIT 4
    #define PARAMETER_LIMIT 10
    #define COMMAND_LIMIT 100
    int main(void)
    {
      char tampon[MAX_LINE][LINE_LIMIT];
      int nbline=0,nb_charlu,i;  
      char BUFF[BUFFSIZE];
      FILE *fildes; 
      /*On va ouvrir le fichier qui contient noos processus*/
      filedes = fopen("/home/Documents/Programation/monfic.txt","r");
     
     
      while(nbline < MAX_LINE  // tant qu'on n'a pas rempli le tableau
              && fgets(tampon[nbline], LINE_LIMIT, fildes) != NULL))// il y a quelque chose à lire
      {
          char *p = strchr(tampon[nbline], '\n');  // on vire le retour chariot laisse par fgets
         if (p == NULL)
         {
            // ici problème la taille LINE_LIMIT est trop petite
            // à toi de voir ce que tu veux faire
         }
         else
         {
            // ici c'est bon, on vire le '\n'
            *p = 0;
            nbline++; // on peut lire la ligne suivante
         }
       }
       // la lecture est terminée, on ferme le fichier
       fclose(filedes);
       ......................
       .......................
      return 0;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    merci.. TRAP D pour ta reponse..

    les constantes au niveau des # define noous sont imposées....


    est il possible à partir du tableau récuperer de passer les commandes à notre exec:
    pour avoir du genre :

    fichier.txt contient : --> ls -l
    cat /proc/exemple

    dans mon tableau tampon il y aura donc : tampon [0][0]: ls -l
    tampon [0][1]: cat /proc/exemple

    je passe à char *argv[] {"ls","-l"}
    et je fais un execv(argv[0],argv};

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    je n'ai jamais beaucoup pratiqué les execv et autres, mais d'après ce que je lis
    Les arguments const char *arg ainsi que les points de sus*
    pension des fonctions execl, execlp, et execle peuvent
    être vues comme des arg0, arg1, ..., argn. Ensemble ils
    décrivent une liste d'un ou plusieurs pointeurs sur des
    chaînes de caractères terminées par des caractères nuls,
    qui constituent les arguments disponibles pour le pro*
    gramme à exécuter. Par convention le premier argument
    doit pointer sur le nom du fichier associé au programme à
    exécuter. La liste des arguments doit se terminer par un
    pointeur NULL.

    Les fonctions execv et execvp utilisent un tableau de
    pointeurs sur des chaînes de caractères terminées par des
    caractères nuls, qui constituent les arguments disponibles
    pour le programme à exécuter. Par convention le premier
    argument doit pointer sur le nom du fichier associé au
    programme à exécuter. Le tableau de pointeur doit se ter*
    miner par un pointeur NULL.
    il faut que tu mettes en premier argument le nom du programme à lancer, et en deuxième argument un tableau de pointeurs vers des chaines, donc faire un truc du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char *arg[3];
    arg[0] = "monprog.exe";
    arg[1] = tampon[i]; // si tu veux lancer la ième ligne de ton tableau tampon
    arg[2] = NULL;
    execv("monprgo.exe", arg);
    Sans garantie aucune, mais on doit pas en être loins.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    hello trap D
    j ai pu jusk la recuperer mes commandes de mon fichier txt,
    les envoyer dans mon tableau tampon,
    par contre qand je veux recuperer les arguments pour faire kom dans la reponse precedente il me met SEGMENTATION FAULT....

    la partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    x=0;
    y=0; z=0;
     
    	do
    	 {
    		arg[z] = tampon[x][y];
    			if(tampon[x][y] == ' ')
    				{ z++; }
    			else
    				y++;		
    			}
     
    	while(tampon[x][y] != '\n');
     
     
    for(i=0;i<z;i++) //je veux verifier kil ma bien dissocier mes arguments
    	{
    		printf("%s\n",arg[i]);
    	}
     
     }
    ***************************************************************
    par contre au niveau du while kan je change le != et je me met '==' à la place : plus de de segmentation fault mais il affiche pa le arg[i]

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut erreur trouvé... pour affichage
    le gros probleme qui me reste à resoudre reste comment passer à mon exec les arguments que j ai recuperer.

    par exemple j ai un tableau arg[0][] = ls
    arg[1][] = -l
    comment les passer automatiquement à execl(arg0,arg1,...,o)
    sachant que le nombre d'argument varie d'une ligne de commande à une autre....????

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    utiliser execv() à la place de execl() ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5
    Points : 1
    Points
    1
    Par défaut processus en parallele
    quelqu'un saurait il comment lancer des processus en parallele sachant que j ne peux en lancer que 2 maximum en parallele..
    le probleme se pose kan j en ai + d 2.
    car avec 2 j fais une boucle for () juska 2;
    mais au dela il faut que le processus pere attende qu'au moins un de ses fils se termine.....

Discussions similaires

  1. Réponses: 14
    Dernier message: 20/11/2014, 15h48
  2. Lancer une commande SQL (postgreSQL) dans un shell
    Par vandman dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 20/10/2014, 09h55
  3. Monter une partition se trouvant dans un fichier
    Par Celelibi dans le forum Administration système
    Réponses: 3
    Dernier message: 02/04/2006, 18h56
  4. [DOS] Commande pour écrire dans un fichier texte
    Par Jeff87-01 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 28/03/2006, 01h04
  5. Lancer des commandes dos à partir d'un fichier texte
    Par tpdm dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/08/2005, 16h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo