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:
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:
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:
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 !