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 :

problème execv NULL


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut problème execv NULL
    Bonsoir,

    Je veux exécuter des commandes comme ls mais quand je tape des commandes plus longues que deux caractères, les caractères en plus de passent pas dans ma fonction. J'ai trouvé que c'est cette 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
    22
    23
    24
    25
    26
    27
    28
     void    loop(t_env *env2, char *buffer)
    {
      char  *patate;
      char  **tab1;
      int   i;
     
      i = 0;
      tab1 = init(env2);
      tab1 = my_str_to_wordtab(*my_getenv("PATH", env2->environ), ':');
      i = 0;
      while (tab1[i] != NULL )
        {
          patate = malloc((my_strlen(tab1[i]) + my_strlen(buffer) + 1) * sizeof(char*));
          if (patate == NULL)
            my_putstr_error("errreur amlloc");
          strcat(patate, *tab1);
          del_char(patate, '=');
          del_str(patate, "PATH");
          strcat(patate, "/");
          strcat(patate, buffer);
          i++;
          /* free(patate); */
        }
      /* while (patate[i] != '\0') */
      /*   i++; */
      patate[i] = NULL; /* c'est cette ligne */
      verif(patate);
    }
    Mais quand je l'enlève, execl m'affiche une erreur.

    Merci de votre aide d'avance et bonne soirée.

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Euh... Je ne comprends pas franchement ce que ton code est suppose faire la... Pourquoi ne pas executer la commande avec ce que te retourne la fonction "my_str_to_wordtab" ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut
    la fonction my_str_to_wrdtab ne renvoie que le path je le concatène avec la commende à exécuter

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
          patate = malloc((my_strlen(tab1[i]) + my_strlen(buffer) + 1) * sizeof(char*));
          if (patate == NULL)
            my_putstr_error("errreur amlloc");
          strcat(patate, *tab1);
    - Tu ne peux pas utiliser strcat() pour copier une chaine : elle sert à concaténer deux chaines. La chaine de départ peut évidemment être vide mais ce doit être une chaine donc terminée par '\0'. Ou tu utilises strcpy() ou avant le strcat() tu places le 0 : *patate = '\0'

    - Dans le malloc(), le sizeof(char*) indique que tu veux allouer des pointeurs sur char (auquel cas le type de patate devrait être char**). Tu dois avoir sizeof(char) (ou rien du tout puisqu'il est certain que sizeof(char) ==1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      tab1 = init(env2);
      tab1 = my_str_to_wordtab(*my_getenv("PATH", env2->environ), ':');
    Ce code est bizarre : je ne sais pas ce que fait init() ni ce qu'il renvoie, mais dans tous les cas la valeur renvoyée ne sert à rien puisqu'on ne s'en sert pas avant de l'écraser à la ligne suivante.

  5. #5
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut
    init sert a malloc tab1 et d'autres variables. et c'est bien strcat car je veux concaténer patate et tab1.
    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
     
    char    **init(t_env *env2)
    {
      char  **tab;
     
      env2->s1 = malloc(4096 * sizeof(char*));
      env2->s1 = *my_getenv("PATH", env2->environ);
      env2->s3 = malloc((env2->len) * sizeof(char**));
      tab = malloc((cpt_word(env2->s1, ':') + 1) * sizeof(*tab));
      return (tab);
    }
     
    void    loop(t_env *env2, char *buffer)
    {
      char  *patate;
      char  **tab1;
      int   i;
     
      i = 0;
      tab1 = init(env2);
      tab1 = my_str_to_wordtab(*my_getenv("PATH", env2->environ), ':');
      i = 0;
      while (tab1[i] != NULL )
        {
          patate = malloc((my_strlen(tab1[i]) + my_strlen(buffer) + 1) * sizeof(char*));
          if (patate == NULL)
            my_putstr_error("errreur amlloc");
          patate[0] = '\0';
          strcat(patate, *tab1);
          del_char(patate, '=');
          del_str(patate, "PATH");
          strcat(patate, "/");
          strcat(patate, buffer);
          i++;
          /* free(patate); */
        }
      /* while (patate[i] != '\0') */
      /*   i++; */
      patate[i] = '\0';
      verif(patate);
    }

  6. #6
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 871
    Par défaut
    Citation Envoyé par Rémi1995 Voir le message
    la fonction my_str_to_wrdtab ne renvoie que le path je le concatène avec la commende à exécuter
    Pour autant que je sache, ce n'est pas du tout ce que cette fonction est censée faire ! Prenons un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *str = "je/suis/un/test/";
    char **words = my_str_to_wordtab(str, '/');
     
    // contenu de words : ["je", "suis", "un", "test"]
    Donc encore une fois, je ne comprends pas ce que tu veux faire...

  7. #7
    Membre confirmé
    Homme Profil pro
    Lycéen
    Inscrit en
    Novembre 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Novembre 2011
    Messages : 95
    Par défaut
    e récupère la path entière ce qui me donne:
    /bin:/sbin:/usr/bin:/usr/sbin:/usr/heimdal/bin:/usr/heimdal/sbin:/home/boivin_r/bin

    ma fonction my_str_to_wordtab me donne

    /bin
    /sbin
    /usr/bin
    /usr/sbin
    /usr/heimdal/bin
    /usr/heimdal/sbin
    /home/boivin_r/bin

    ensuite je la concatène avec buffer et je stockes les deux dans patate.

  8. #8
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    init sert a malloc tab1 et d'autres variables...
    Je veux bien, mais la ligne qui suit init() détruit l'adresse renvoyée par init().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      tab1 = init(env2);
      tab1 = my_str_to_wordtab(*my_getenv("PATH", env2->environ), ':');
    ... c'est bien strcat car je veux concaténer patate et tab1.
    J'ai bien compris, mais le premier appel à strcat() veut être en fait une copie donc il fallait initialiser patate. D'ailleurs, tu l'as rajouté dans le code.

    - Ma remarque sur le sizeof (char*) est toujours valable.

Discussions similaires

  1. [ACCESS-2002][recordset] Problème de NULL
    Par Sephiroth_ttt dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/05/2007, 16h10
  2. problème avec null
    Par HighSchool2005 dans le forum Langage
    Réponses: 6
    Dernier message: 26/04/2007, 11h13
  3. Code : problème avec Null
    Par mat75019 dans le forum Access
    Réponses: 4
    Dernier message: 02/05/2006, 15h01
  4. Lots DTS et import Excel - problème de NULL
    Par gavelin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/01/2006, 15h13
  5. Problème avec NULL
    Par Fiquet dans le forum Débuter
    Réponses: 5
    Dernier message: 26/10/2005, 13h40

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