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

Linux Discussion :

(execve et EFAULT) Shell perso ;)


Sujet :

Linux

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut (execve et EFAULT) Shell perso ;)
    Bonjour,
    je suis actuellement entrain de coder un shell mais je rencontre un problème assez délicat.

    mon shell exécute toutes les binaires (ls,...)
    j'ai coder un parseur pour gérer le cas ou dans ma chaine de caractère comporte une etoile.

    ex:
    >> ls *.c
    mon parseur recupere le "mot" *.c et le remplace par tout les .c du fichier courant (jusque la pas de probleme , je print la ligne est elle est correct.)
    cependant execve m'envoi l'erreur ERRNO 14 soit EFAULT.

    cet erreur correspond a
    EFAULT
    L'argument fichier pointe en dehors de l'espace d'adressage accessible.

    apres plusieur teste je me rend compte que mon shell n'execute :
    ni "ls *.c"
    ni ls ma*.*
    mais qui gere bien "ma*.c"

    Quelqu'un aurait-il une idee ?

    Cordialement
    Leoz

  2. #2
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    salut !
    pour pouvoir t'aider il faudrait qu'on voit ton code. on peut pas deviner tes erreurs ^^

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    et voila voili voilou les bouts de code concerner ^^

    Merci

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    char    *parse_star(char *str)
    {
      char  **tabl;
      char  **retab;
      char  *str2;
      int   i;
      int   e;
     
      e = 0;
      i = 0;
      str = space(str);
      tabl = str_to_wordtab(str, " ");
      retab = xmalloc(sizeof(*retab) * strlen(str));
      while (tabl[i] != NULL)
        {
          retab[e] = star(tabl[i]);
          e++;
          i++;
        }
      retab[e] = NULL;
      str2 = tab_to_str(' ', retab);
      return (str2);
    }
     
     
    -------------------------------------------------------------
     
    static void     exec_wait(t_info *info)
    {
      int           statut;
      int           i;
     
      i = 0;
      if (info->nb_wait > 0)
        while (i++ < info->nb_wait)
          wait(&statut);
      info->nb_wait = 0;
    }
     
    int             execute(t_mysh *mysh)
    {
      t_pipe        *lpipe;
      t_cmd         *lcmd;
      t_cmp         cmp;
     
      cmp.i = 0;
      lcmd = mysh->icmd->begin;
      while (cmp.i <  mysh->icmd->len_list)
        {
          cmp.j = 0;
          mysh->info->flag = FALSE;
          lpipe = lcmd->begin_pipe;
          mysh->info->std = lcmd->len_list_pipe;
          while ((cmp.j < lcmd->len_list_pipe) || (mysh->info->std > 0))
            {
              check_cmd(epur_str(lpipe->table_pipe), mysh);
              mysh->info->flag = TRUE;
              lpipe = lpipe->next;
              mysh->info->std--;
              cmp.j++;
            }
          exec_wait(mysh->info);
          lcmd = lcmd->next;
          cmp.i++;
        }
      return (TRUE);
    }
    -------------------------------------------------------------------
    #include <string.h>
    #include <unistd.h>
    #include <stdlib.h>
    #include <errno.h>
     
    # define        MSG_ERROR_EXECVE        "2: execve c'est mal terminer!\n"
     
    int                     xexecve(char *bin_path, char **bin_cmd)
    {
      extern        char    **environ;
      int                   fd;
     
      fd = 0;
      fd = execve(bin_path, bin_cmd, environ);
      if (fd == (-1))
        {
          printf("errno => %i\n", errno);
          write(2, MSG_ERROR_EXECVE, strlen(MSG_ERROR_EXECVE));
          exit(0);
        }
      return (fd);
    }

  4. #4
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    pourrais tu indenter ton code ? et me dire ou est passée la fonction main ! ^^
    je suppose que c'est dans le main que tu appel xexecve ?

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 15
    Par défaut
    en fait c'est un shell complet recoder par nos soins (etudiant d'une ecole d'info), je pensse qu'il serait plus judicieux de te fournir un .rar plutot que fichier par fichier ^^

    allez un petit main juste pour te montrer ^^
    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
     
    int             main()
    {
      t_mysh        *mysh;
      char          area[BUF_SIZE + 1];
      char          *term;
     
      mysh = xmalloc(sizeof(*mysh));
      malloc_all(mysh);
      if ((term = check_error()) != NULL)
        init_cap(mysh->cap, area);
      signal(SIGWINCH, show_win_size);
      path_search(mysh->env);
      add_old_story(mysh->story, ARG_STORY);
      wait_cmd(mysh, mysh->info);
      xtputs(mysh->cap->maudible_bell, 1, my_outc);
      free_all(mysh);
      return (EXIT_SUCCESS);
    }
    Ps: je peut pas indenter dans les balises quote...

  6. #6
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Citation Envoyé par leoz2007 Voir le message
    Ps: je peut pas indenter dans les balises quote...
    alors utilse la balise CODE ^^ c'est le #

Discussions similaires

  1. Lancer un processus depuis un shell perso
    Par kanadianDri3 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 03/08/2011, 09h49
  2. Creation d'un shell probleme avec execve
    Par Mouch2 dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2011, 17h37
  3. Réponses: 4
    Dernier message: 07/12/2002, 15h24
  4. D6 Perso et Gen d'état
    Par diam's dans le forum Autres outils décisionnels
    Réponses: 6
    Dernier message: 02/12/2002, 17h58
  5. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39

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