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 !