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[i] = 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[i] != 0; i++)
printf("%d : %s\n", i, elem[i]);
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[i] != NULL; i++){
snprintf(pathname, sizeof pathname, "%s/%s", dirs[i], 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;
}
# Comment dire
Posté par mrlem (site web personnel) . Évalué à 3.
Ça nous donnera droit à quel diplôme ?
Nan, parceque ce sont bien les gens qui fournissent le travail qui décrochent le diplôme, non ?
[^] # Re: Comment dire
Posté par Kerro . Évalué à 2.
Si un diplôme indiquait que du travail a été fourni, ce serait une grande nouvelle. Souviens-toi de certains de tes camarades :-)
Ce n'est pas une bijection, donc en travaillant on peut avoir un diplôme.
Dans la même veine :
- ce sont ceux qui travaillent qui récoltent le salaire
- ce sont ceux qui sont compétents qui sont aux manettes
[^] # Re: Comment dire
Posté par Sytoka Modon (site web personnel) . Évalué à 2.
Ah ah, c'est pour cela qu'il est possible de faire une école (cotée) qui ne délivre aucun diplôme, boulot quasi assuré en sortie. Je la conseille à tous les Spé…
# Aide?
Posté par delio . Évalué à 3.
Dis-nous ce que tu as essayé de faire, ce que ça donne, ce que tu n'as pas compris.
Là on pourra peut-être t'aider.
Si on le fait à ta place on ne t'aide pas.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.