processus / minishell - C - Programmation
Marsh Posté le 27-12-2013 à 18:07:10
Bonjour,
Il existe des balises de code pour que cela soit plus lisible:
Code :
|
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 :
|
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 |
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
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);
}