processus / minishell

processus / minishell - C - Programmation

Marsh Posté le 25-12-2013 à 18:09:53    

bonjour,
 
je dois faire un minishell, et pour les fork wait et les pid je n'ai pas tout compris je vous montre mon main ou je fork
 
le probleme que j'ai c'est quand j'appelle la fonction changedir et que j'éxecute la commande ls dans le minishell si je refais un deuxieme ls je retourne dans le dossier de départ...
 
donc je sais pas si je dois copier l'env aussi au passage et/ou changer la ligne PWD= dedans
 
ou alors c'est au niveau des processus ca reprend dans un processus ou le changement de répértoire n'est pas effectué.
 
SI vous pouviez jeter un oeil a mon code ca serait sympa !
 
int     main(int ac, char **av, char **env)
{
  char  **tab;
  char  *str;
  char  *str2;
  char  c;
  char  buffer[512];
  int   pid;
  int   ret;
  int   i;
  int   test;
  int   status;
 
  i = 0;
  str = NULL;
  while (str == NULL)
    {
      str = find_path(env[i]);
      i++;
    }
  test = 1;
  tab = get_different_pathes(str);
  while (42)
    {
      while (pid != 0)
        {
          if ((pid = fork()) != -1)
            if (pid != 0)
              wait(&status);
        }
      my_putstr("$>" );
      i = 0;
      ret = 1;
      c = '\0';
      while ((ret = read(0, &c, 1)) > 0 && c != '\n')
        {
          buffer[i] = c;
          i++;
        }
      buffer[i] = '\0';
      str2 = my_strdup(buffer);
      test = check_command(str2, tab, av, env);
      wait(&status);
    }
return (0);
}

Reply

Marsh Posté le 25-12-2013 à 18:09:53   

Reply

Marsh Posté le 27-12-2013 à 18:07:10    

Bonjour,

 

Il existe des balises de code pour que cela soit plus lisible:

Code :
  1. Comme ça
 

Je n'ai pas tout compris de ce que tu fais mais en effet il y a un problème de
gestion des fork et des wait.

 

Le principe c'est:

 
Code :
  1. while (42)
  2. {
  3.     /* Afficher le prompt et attendre une commande de l'utilisateur: */
  4.     [...]
  5.     /* traitement de la commande: */
  6.     pid = fork()
  7.     switch(pid)
  8.     {
  9.         case -1:
  10.             //gérer l'erreur
  11.             break;
  12.         case 0:
  13.             /* ici on est dans le processus fils. Dans le cas d'un shell, c'est ici
  14.             qu'on va faire l'execution de la commande de l'utilisateur. */
  15.             exit(0); /* À la fin il faut terminer le processus fils d'une façon ou
  16.             d'une autre */
  17.         default:
  18.             /* ici c'est le processus père qui continue. Dans le cas d'un shell, on
  19.             aura simplement un appel à wait pour qu'il attende la fin de son fils
  20.             (sauf si on gère les processus en arrière plan mais c'est plus
  21.             compliqué).*/
  22.             break;
  23.     }
  24.     /* ici on est toujours dans le processus père puisque le fils est mort et a été
  25.     attendu. on peut attendre une nouvelle commande.*/
  26. }
 

Pour ce qui est du changement de répertoire il ne faut pas faire cela dans un
processus fils. Si tu fork, tu crées 2 processus indépendants et le changement
de répertoire pour l'un n'a aucune action sur l'autre.

 

Plutôt que de faire des read bizarres sur stdin, tu peux utiliser la fonction
fgets:

 
Citation :

char *fgets(char *s, int size, FILE *stream);

 

fgets()  reads  in  at  most one less than size characters from stream and stores them into the
buffer pointed to by s.  Reading stops after an EOF or a newline.  If a newline is read, it  is
stored  into  the buffer
.  A terminating null byte ('\0') is stored after the last character in
the buffer.



Message édité par ptitchep le 27-12-2013 à 18:14:01

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 10-01-2014 à 23:02:58    

merci pour ta réponse, ca m'a bien aidé meme si je me suis tapé une mauvaise note au final car j'ai oublié de protégé contre env -i avt l'éxécution, en tout cas c'était sympas de répondre

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed