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 :

tableau de char *, 2eme argument d'execvp


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Par défaut tableau de char *, 2eme argument d'execvp
    Salut a tous,

    je voudrais lancer un script ( .sh) a partir d'un programme c, en lui passant une liste de char * .

    Je crois que le plus simple est un execvp("Monscript.sh", MaMatrice.de.Char), et ainsi MonScript.sh aura les char* dans ses variables &1, &2 etc...

    Mon probleme est que je n'arrive pas a remplir MaMatrice... Je suis perdu entre les erreurs de segmentation et les erreurs de type...

    Mon ideal serait de pouvoir decider dynamiquement du nombre de char* que je donne a ma matrice (enfin tableau de char* quoi...)

    Voila ce que j'ai fait jusqu'a present:
    (je laisse en commentaire les differents essais que j'ai pu faire, si ca peut vous eclairer...)

    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
     
    char * MyTestcchar[20]; 
    		//		MyTestcchar = (char **)malloc(sizeof(char)*100);  //Why doesn't it works ???
    			/*	MyTestcchar = (char ** )malloc(sizeof(char)*10*20);
    				MyTestcchar[0] = (char *)malloc(sizeof(char)*10);
    				MyTestcchar[1] = (char *)malloc(sizeof(char)*10);
    				MyTestcchar[2] = (char *)malloc(sizeof(char)*10);
    				MyTestcchar[3] = (char *)malloc(sizeof(char)*10);
    				MyTestcchar[4] = (char *)malloc(sizeof(char)*10);
    				MyTestcchar[5] = (char *)malloc(sizeof(char)*10);
     
    				sprintf(MyTestcchar[0], "1st case");
    				sprintf(MyTestcchar[1], "2nd case");
    				sprintf(MyTestcchar[2], "3rd case");
    				sprintf(MyTestcchar[3], "4th case");
    				sprintf(MyTestcchar[4], "5rd case");
    				sprintf(MyTestcchar[5], "6th case");
     
    				printf("\n\nTestcchar : %s\n",MyTestcchar[0]);
     
    				*/
    				pid_t child_script;
    				child_script = fork();
    				if(child_script == 0){
    					if(execvp("./SampleAlexPart.sh",&MyTestcchar[0]) < 0) {    
    						printf("*** ERROR: execvp failed  *** \n");
    						exit(1); }
    				}
    				else {
    						wait(NULL);
    				}
    Merki d'avance
    (au fait je suis pas du tout absolument pour utiliser un execvp, ou bien faire un tableau de char*, si vous avez une idee qui pose pas de probleme d'allocation memoire... je prend )

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Bin ceci est complètement faut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(execvp("./SampleAlexPart.sh",&MyTestcchar[0]) < 0)
    Ici tu passes l'adresse du premier caractère de l'indic 0 de ton tableau de char or la fonction attend le tableau de char au complet, passe simplement le nom de ton tableau comme pour tout autre argument, je ne vois rien de compliqué, faut juste rester censé et... logique !

    Attention également à une chose, tu n'utilise pas bien ton tableau car en effet, cela doit être un tableau initialisé ou sinon tu passes NULL à la fonction car comme dit dans la page man: http://man.developpez.com/man3/execvp.3.php:

    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 terminer par un pointeur NULL.
    Un exemple d'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdlib.h>
    #include <unistd.h>
    #include <errno.h>
     
     
    int main (void)
    {
       char * args [] = { "ls", "-l", NULL };
     
     
       execvp ("ls", args);
       return EXIT_SUCCESS;
    }
    Pour couper court, ce tableau n'est autre que des arguments que tu passes au programme appelé !
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    soit en statique comme t'as montré franck, soit en dynamique

    : http://c.developpez.com/faq/c/?page=...bleau_2D_alloc

  4. #4
    Candidat au Club
    Inscrit en
    Juin 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 2
    Par défaut Remerciements et complément
    Merci Franck et Dark_Ebola

    bon ca doit pas vous étonner, ca marche ...

    Je tiens a m'excuser pour la FAQ ...

    Sinon Franck, hum...

    Bin ceci est complètement faut:
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(execvp("./SampleAlexPart.sh",&MyTestcchar[0]) < 0)
    Ici tu passes l'adresse du premier caractère de l'indic 0 de ton tableau de char or la fonction attend le tableau de char au complet, passe simplement le nom de ton tableau comme pour tout autre argument, je ne vois rien de compliqué, faut juste rester censé et... logique !
    Oui cela me permet de choisir a partir de quel indice je veux qu' execvp "voie" mon tableau. En effet, si je ne me trompe pas,
    &MyTab[0] = MyTab

    et ainsi en faisant &MyTab[i] , je peux donner mon tableau a execvp en lui faisant "croire" que le tableau commence a l'indice i ...


    En fait mon execvp marche en utilisant la notation &MyTab[i] . Mais du coup je comprend pas bien ce qui ne marchait pas dans mon code original : c'est le cast (char *) devant le malloc que j'aurais pas du mettre ? mais du coup il sert a quoi ce cast, si on peut ne pas le mettre ?

  5. #5
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    ton code corrigé (vite fait) et ré-indenté

    essaye de poser des questions précises.

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <sys/wait.h>
     
    int
    main (void)
    {
      char *MyTestcchar[20];
     
      MyTestcchar[0] = malloc (10);
      MyTestcchar[1] = malloc (10);
      MyTestcchar[2] = malloc (10);
      MyTestcchar[3] = malloc (10);
      MyTestcchar[4] = malloc (10);
      MyTestcchar[5] = malloc (10);
      MyTestcchar[6] = NULL;
     
      sprintf (MyTestcchar[0], "1st case");
      sprintf (MyTestcchar[1], "2nd case");
      sprintf (MyTestcchar[2], "3rd case");
      sprintf (MyTestcchar[3], "4th case");
      sprintf (MyTestcchar[4], "5rd case");
      sprintf (MyTestcchar[5], "6th case");
     
      printf ("\n\nTestcchar : %s\n", MyTestcchar[0]);
     
      pid_t child_script;
      child_script = fork ();
      if (child_script == 0)
        {
          if (execvp ("echo", &MyTestcchar[0]) < 0)
            {
              printf ("*** ERROR: execvp failed  *** \n");
              exit (1);
            }
        }
      else
        {
          wait (NULL);
        }
      return 0;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. decalage à gauche sur une tres grand tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 10
    Dernier message: 14/07/2005, 22h40
  2. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  3. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  4. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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