Léa-Linux & amis :   LinuxFR   GCU-Squad   Zarb.Org   GNU
Comment intégrer les modifications au mini-shell
Envoyé par: delirva


bonjour,


un petit shell simple se compose des deux fichiers decouper.c et minishell.c (fichiers joints) ;
comment apporter les modifications suivants;
Les processus en arrière plan
La commande cd
Les redirections d'entrées-sorties vers des fichiers (avec >, >> et < au moins).
Les pipes (y compris l’enchaînement de deux pipes comme dans ls | cat | wc).
merci de m'aider !

bonnes fêtes !

cordialement
```
/* decouper.c
Un wrapper autour de strtok
*/
# include <stdio.h>
# include <string.h>

/* decouper -- decouper une chaine en mots */
int
decouper(char * ligne, char * separ, char * mot[], int maxmot){
int i;

mot[0] = strtok(ligne, separ);
for(i = 1; mot[i - 1] != NULL; i++){
if (i == maxmot){
fprintf(stderr, "Erreur dans la fonction decouper: trop de mots\n");
mot[i - 1] = NULL;
break;
}
mot = strtok(NULL, separ);
}
return i;
}

# ifdef TEST
int
main(int ac, char * av[]){
char *elem[10];
int i;

if (ac < 3){
fprintf(stderr, "usage: %s phrase separ\n", av[0]);
return 1;
}

printf("On decoupe '%s' suivant les '%s' :\n", av[1], av[2]);
decouper(av[1], av[2], elem, 10);

for(i = 0; elem != 0; i++)
printf("%d : %s\n", i, elem);

return 0;
}
# endif
```
***************
```
/* minishell.c

Un shell elementaire (fork + exec et c'est tout)
*/
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <assert.h>

enum {
MaxLigne = 1024, // longueur max d'une ligne de commandes
MaxMot = MaxLigne / 2, // nbre max de mot dans la ligne
MaxDirs = 100, // nbre max de repertoire dans PATH
MaxPathLength = 512, // longueur max d'un nom de fichier
};

void decouper(char *, char *, char **, int);

# define PROMPT "? "

int
main(int argc, char * argv[]){
char ligne[MaxLigne];
char pathname[MaxPathLength];
char * mot[MaxMot];
char * dirs[MaxDirs];
int i, tmp;

/* Decouper UNE COPIE de PATH en repertoires */
decouper(strdup(getenv("PATH")), ":", dirs, MaxDirs);

/* Lire et traiter chaque ligne de commande */
for(printf(PROMPT); fgets(ligne, sizeof ligne, stdin) != NULL; printf(PROMPT)){
decouper(ligne, " \t\n", mot, MaxMot);
if (mot[0] == NULL) // ligne vide
continue;

tmp = fork(); // lancer le processus enfant
if (tmp < 0){
perror("fork");
continue;
}

if (tmp != 0){ // parent : attendre la fin de l'enfant
while(wait(NULL) != tmp)
;
continue;
}

// enfant : exec du programme
for(i = 0; dirs != NULL; i++){
snprintf(pathname, sizeof pathname, "%s/%s", dirs, mot[0]);
execv(pathname, mot);
}
// aucun exec n'a fonctionne
fprintf(stderr, "%s: not found\n", mot[0]);
exit(1);
}

printf("Bye\n");
return 0;

}

```

Poste le Wednesday 30 December 2015 10:20:38
Répondre     Citer    
Re: Comment intégrer les modifications au mini-shell
Envoyé par: Jiel

Salut,

Ici ce n'est pas vraiment l'endroit où on fait les devoirs des autres. Tu peux toujours demander de l'aide si tu as fait quelque chose qui ne marche pas, mais tu as peu de chance de recevoir une réponse si tu demandes : "il faut faire ça, et ça, et ça". N'oublie pas que les gens ici sont bénévoles !

Bonne soirée,

Poste le Monday 8 February 2016 16:26:24
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Comment intégrer les modifications au mini-shell
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Serveur hébergé par ST-Hebergement et Lost-Oasis / IRC hébergé par FreeNode / NS secondaire hébergé par XName
Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons