Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1026 connectés 

  FORUM HardWare.fr
  Programmation
  C

  processus / minishell

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

processus / minishell

n°2214427
archseven
Posté le 25-12-2013 à 18:09:53  profilanswer
 

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);
}

mood
Publicité
Posté le 25-12-2013 à 18:09:53  profilanswer
 

n°2214516
ptitchep
Posté le 27-12-2013 à 18:07:10  profilanswer
 

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
n°2215797
archseven
Posté le 10-01-2014 à 23:02:58  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  processus / minishell

 

Sujets relatifs
attendre fin d'un processus[Résolu] [Oracle] Conflit de processus d'ecoute
Lancer processus sous conditionPERL - Communication processus pere/fils
[C#] savoir si un processus est en train de réfléchir, possible ?[C][Gnu] info utilisation memoire, processeur et swap [résolu]
logger ouverture fermeture processusProcessus asynchrone avec MAJ de l'interface
vb.net rediriger processus dans 2 textboxRécuprerer un processus mis en pause
Plus de sujets relatifs à : processus / minishell


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR