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 :

Erreur mauvais descripteur de fichier, shell unix


Sujet :

C

Vue hybride

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut Erreur mauvais descripteur de fichier, shell unix
    Bonjour,

    je recode actuellement un minishell unix.
    A l'heure actuelle, je suis confronté au problème suivant :
    lorsque je ne rentre pas de commande à mon programme (que j'appuie direct sur entrée à la place de saisir une commande seule / avec des options), je veux que mon programme affiche "Pas de commande saisie, veuillez tapez une commande\n" et qu'un appel à read soit relancé etc., bref, que mon programme ne s'arrête pas.

    Mon programme fonctionne bien, SAUF quand je ne saisi pas de commande, dans le 2e code ci-dessous, je tape successivemnt "ls", "ls -l", "ls -l -a", "\n", "ls".
    Dés que je fais \n, les commande que je tape ensuite sont erronnées :

    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
    ./a.out
    ls
    a.out           main.c~              my_str_to_wordtab.c  put_env_in_list.c
    concat_path.c   my_cmd_to_wordtab.c  no_cmd.c             recup_path.c
    concat_path.c~  mysh.h               prep_av.c
    main.c          mysh.h.gch           prep_av.c~
    ls -a
    .              concat_path.c~       mysh.h               prep_av.c
    ..             main.c               mysh.h.gch           prep_av.c~
    a.out          main.c~              my_str_to_wordtab.c  put_env_in_list.c
    concat_path.c  my_cmd_to_wordtab.c  no_cmd.c             recup_path.c
    ls -la     // Alignement ok, problème formatage suite au masquage groupe et login
    total 2468 
    drwxr-xr-x  2 login groupe    4096 25 avril 14:56 .
    drwxr-xr-x 57login groupe   4096 24 avril 19:40 ..
    -rwxr-xr-x   1 login groupe  14167 25 avril 14:56 a.out
    -rw-r--r--     1 login groupe    1575 25 avril 14:36 concat_path.c
    -rw-r--r--     1 login groupe    1675 25 avril 14:22 concat_path.c~
    -rw-r--r--     1 login groupe      943 25 avril 14:52 main.c
    -rw-r--r--     1 login groupe      898 25 avril 14:51 main.c~
    -rw-r--r--     1 login groupe    1196 24 avril 19:12 my_cmd_to_wordtab.c
    -rw-r--r--     1 login groupe    1223 24 avril 18:13 mysh.h
    -rw-r--r--     1 login groupe 2450992 24 avril 21:26 mysh.h.gch
    -rw-r--r--     1 login groupe    1254 24 avril 14:09 my_str_to_wordtab.c
    -rw-r--r--     1 login groupe      465 23 avril 22:58 no_cmd.c
    -rw-r--r--     1 login groupe    1132 25 avril 14:39 prep_av.c
    -rw-r--r--     1 login groupe    1206 25 avril 14:37 prep_av.c~
    -rw-r--r--     1 login groupe    1926 23 avril 20:09 put_env_in_list.c
    -rw-r--r--     1 login groupe    1388 24 avril 14:25 recup_path.c
    //Je tape ici '\n' seulement
    Pas de commande saisie, veuillez saisir une commande
    ls
    ls: erreur d'écriture: Mauvais descripteur de fichier
    Si je retape une commande ensuite j'ai toujours le "commande:erreur d'écriture:Mauvais descripteur de fichier".
    Si je retape directement "\n", ca me fait juste un"\n", ça n'écrit plus "Pas de commande saisie, veuillez saisir une commande".

    Voici mon main :

    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
    int	main()
    {
      extern char **environ;
      int	rd, i, status;
      int	stop = 0;
      char  buf[1024];
      pid_t	pid;
      while (!stop)
        {
          i = 0;
          while (i < 1025)
    	{
    	  buf[i] = 0;
    	  i++;
    	}
          rd = read(0, buf, 1024);
          if (strncmp(buf, "exit", 4) == 0)
    	stop = 1;
          else
    	{ 
    	  if ((pid = fork()))
    	    waitpid(pid, &status, 0);
    	  else
    	    {
    	      if (no_cmd(buf) == 0)
    		printf("Pas de commande saisie, veuillez saisir une commande\n");
    	      else
    		{
    		  struct s_final_path *fpp = init_final_path();
    		  char *ret = ret_valid_path(fpp, buf);
    		  char **argvv = prep_arg_exec(buf);
    		  execve(ret, argvv, environ);
    		}
    	    }
    	  close(rd);
    	}
        }
    }
    Donc voilà en somme j'aimerais que cette portion du main ne fasse pas tout foirer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     if (no_cmd(buf) == 0)
    		printf("Pas de commande saisie, veuillez saisir une commande\n");
    Si vous pouviez m'expliquer quel est le problème et me conseiller ce serait sympa
    Merci !

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Hello,
    Ceci est totalement incorrect :


    Dans ton code, « rd » est la valeur renvoyée par read(), et cette valeur correspond au nombre d'octets lus par cette fonction en temps normal, à « -1 » en cas d'erreur ou à « 0 », ce qui signifie « appel réussi mais zéro caractère lu » mais qui est en fait le signal d'une fin de fichier atteinte (ou d'un tube refermé par l'écrivain).

    Donc, ce faisant, tu refermes des fichiers au hasard et, si « rd » vaut zéro, tu refermes l'entrée standard. Tu ne risques donc plus de lire grand chose. Si tu tapes « \n », tu lis exactement « 1 » caractère et tu refermes donc la sortie standard. Donc, tu ne vois plus rien s'afficher.

    Par ailleurs, tu fais un dépassement de tableau quand tu remets « buf » à zéro : tu initialises 1025 éléments (de 0 à 1024, donc) dans ta boucle, mais t'en as déclaré que 1024 (numérotés de 0 à 1023, par conséquent). Tu écraseras donc la variable d'à côté. Dans le cas présent, cela n'aura aucun effet mais dans d'autres programmes, cela risque d'être un bug pénible à déceler.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 10
    Par défaut
    Omg ...
    Je me sens un peu c.. , je devais etre bien à l'ouest avec le close(rd) et le pire c'est que je m'en suis meme pas rendu compte en rerererereregardant le code ..
    J'ai du me dire que j'avais use open à la place de read fin bref, aucune excuse là dessus ..

    Merci en tout cas , et concernant le buf, en effet, j'avais apparemment mal calculé le bidule -_-

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par Bifurkk Voir le message
    Omg ... Je me sens un peu c.. , je devais etre bien à l'ouest avec le close(rd) et le pire c'est que je m'en suis meme pas rendu compte en rerererereregardant le code .. J'ai du me dire que j'avais use open à la place de read fin bref, aucune excuse là dessus ..
    Détrompe-toi, ça arrive aux meilleurs, et tout au long d'une carrière ! C'est pour cela que la meilleure chose à faire, quand c'est possible, est de faire relire son programme par une personne extérieure au regard neuf. Et c'est ce que tu as fait. :-)

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

Discussions similaires

  1. Jython - Erreur avec Descripteur de fichier
    Par ElodieH dans le forum Autres
    Réponses: 0
    Dernier message: 19/01/2012, 15h11
  2. Extraire des lignes d'un fichier (shell unix)
    Par guicecal dans le forum Unix
    Réponses: 2
    Dernier message: 22/01/2010, 13h49
  3. Message "mauvais descripteur de fichier"
    Par robux dans le forum Ubuntu
    Réponses: 1
    Dernier message: 06/08/2008, 11h25
  4. Shell Unix pour la Purge de fichiers?
    Par jfmerveille dans le forum C
    Réponses: 2
    Dernier message: 27/02/2007, 01h34
  5. shell unix charger fichiers de variables
    Par waloo16 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 31/01/2007, 17h29

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