__ ___ _ _ _ ____ / / ___ / _ \__ _ _ _ ___ __| |_ _ | || ||___ \ / / / _ \ / /_)/ _` | | | / __| / _` | | | | | || |_ __) | / /__| __/ / ___/ (_| | |_| \__ \ | (_| | |_| | |__ _/ __/ \____/\___| \/ \__,_|\__, |___/ \__,_|\__,_| |_||_____| |___/
$> ls -l
-rwrw-rw- 1 db0 db0 62.1 Ko 2015-03-30 19:37 Impatient C
-rwrw-rw- 1 db0 db0 3.5 Ko 2015-03-30 19:37 Impatient SCM
-rwrw-rw- 1 db0 db0 3.0 Ko 2015-03-30 19:37 Impatient Emacs
-rwrw-rw- 1 db0 db0 2.4 Ko 2015-03-30 19:37 Impatient Man Pages
-rwrw-rw- 1 db0 db0 10.5 Ko 2015-03-30 19:37 Impatient Perl
-rwrw-rw- 1 db0 db0 17.3 Ko 2015-03-30 19:37 Impatient Python
-rwrw-rw- 1 db0 db0 13.6 Ko 2015-03-30 19:37 Impatient Shell Debutant
-rwrw-rw- 1 db0 db0 16.4 Ko 2015-03-30 19:37 Impatient Shell Script
-rwrw-rw- 1 db0 db0 3.4 Ko 2015-03-30 19:37 Impatient Shell
-rwrw-rw- 1 db0 db0 1.8 Ko 2015-03-30 19:37 Impatient Vim
Warning
Contrairement aux autres articles, ceux de cette listes n'ont jamais été vérifiés ni relus depuis que je les ai rédigés en première année. Ils peuvent donc contenir des erreurs. Les informations qu'ils contiennent sont à prendre avec des pincettes et à vérifier.
Archives
-rwrw-rw- 1 db0 db0 0.9 Ko 2015-03-30 19:37 Financer Ses Etudes-rwrw-rw- 1 db0 db0 2.4 Ko 2015-03-30 19:37 Languages A Apprendre En Tek1
-rwrw-rw- 1 db0 db0 1.1 Ko 2015-03-30 19:37 Makefile Le Retour
-rwrw-rw- 1 db0 db0 3.0 Ko 2015-03-30 19:37 Makefile De Base
-rwrw-rw- 1 db0 db0 1.2 Ko 2015-03-30 19:37 Pourquoi_printf_met_tout_a_la_fin
-rwrw-rw- 1 db0 db0 0.7 Ko 2015-03-30 19:37 Pourquoi_utiliser_getnextline_plutot_que_read_pour_le_minishell_et_autre_42sh
-rwrw-rw- 1 db0 db0 4.3 Ko 2015-03-30 19:37 Taille De Donnees Et Structures
-rwrw-rw- 1 db0 db0 1.5 Ko 2015-03-30 19:37 Cflags
-rwrw-rw- 1 db0 db0 1.6 Ko 2015-03-30 19:37 Hidenp.c
-rwrw-rw- 1 db0 db0 0.1 Ko 2015-03-30 19:37 Liens_utiles_my_select
-rwrw-rw- 1 db0 db0 2.1 Ko 2015-03-30 19:37 List_chainees.c
-rwrw-rw- 1 db0 db0 1.0 Ko 2015-03-30 19:37 Memo_rendu
-rwrw-rw- 1 db0 db0 4.8 Ko 2015-03-30 19:37 Minishell.c
-rwrw-rw- 1 db0 db0 32.7 Ko 2015-03-30 19:37 My_printf.c
-rwrw-rw- 1 db0 db0 4.5 Ko 2015-03-30 19:37 Ordalphlong.c
-rwrw-rw- 1 db0 db0 3.7 Ko 2015-03-30 19:37 Qcm.txt
-rwrw-rw- 1 db0 db0 5.8 Ko 2015-03-30 19:37 Str_to_inttab.c
-rwrw-rw- 1 db0 db0 0.6 Ko 2015-03-30 19:37 Verifier_les_fuites_memoires
-rwrw-rw- 1 db0 db0 0.5 Ko 2015-03-30 19:37 Verifier_les_syscall
/*
** Bonjour moutar_j et les autres petits potes !
** Aujourdhui, nous allons expliquer sans entrer dans les details
** le principe du minishell1 !
** Amusez-vous bien.
*/
intmain(int argc, char **argv, char **env)
/*
ETAPE 1 PROMPT
faisons le simple principe d’afficher un prompt qui lit des
commandes et fait rien (pour l’instant) puis qui se raffiche.
*/
while (42)
{
my_putstr("mon_prompt>");
/* Hein ? Mais-euh ca boucle infini >.< Oui, c’est le but. */
get_next_line(0);
/* rappel : mon get_next_line ici present lit sur l’entree standart en renvoie
une chaine de caractere correspondant a ce qu’il a lu jusqu’a un ’\n’.
MAIS ! Pourquoi un get_next_line plutot qu’un simple read, me direz-vous ?
Parce qu’un read, vous allez lui envoyer une certaine taille de buffer.
Il se peut que l’utilisateur (vetu de rouge et sans doute mal-intentione)
ecrive plus que ce buffer ! il le depasse, place des octets arbitraires sur
la pile au dela de la zone que vous lui avez reserve. Cela ecrase une
partie de la pile, et l’utilisateur mal-intotionne y aura place du code !
Ainsi, il entrera a l’interieur de votre machine et la detruiera de
l’interieur ! Mouhahaha et il deviendra le maitre du monde !
Ou plus simplement, vous risquez de Segmentation Faulter.
*/
}
/*
ETAPE 2 LANCER UN PROGRAMME - RECUPERER LE PATH
essayons de lancer un programme. Pour cela, nous utilisons execve.
Cette fonction prend en parametre un path. Il faut donc commencer par
trouver ce path. Pour cela, notre environnement nous fournit un element
appele PATH.
-- > faire un str_to_wordtab de ce qu’a renvoyer get_next_line.
-- > faire une fonction qui recupere le contenu d’un element de l’env.
*/
char*my_getenv(char **env, char *elem/*"PATH"*/)
{
/* je parcours l’env, je trouve la ligne qui commence par PATH*/
/* j’envoie l’adresse de ce qui se trouve apres le ’=’ */
}
/* -- > faire une fonction qui recupere uns a uns les paths dans cet elem
-- > faire une fonction qui ajoute a la suite du path recupere le
element du tableau de str_to_wordtab.
Tester ces paths avec la fonction access. Comment elle marche ? -> man
*/
/*
ETAPE 3 LANCER UN PROGRAMME - FORKER
Une fois qu’on a recuperer le path, qu’on sait que c’est le bon, on va
forker. Pourquoi ? parce qu’apres avoir lancer execve, le programme s’arrete.
On veut arreter le programme, pas le minishell. Il faut donc duppliquer le
prog. C’est le role de fork. Le cours explique comment il marche.
A vous de jouer.
*/
/*
ETAPE 3 LANCER UN PROGRAMME - EXECVE
execve doit etre execute dans le fils. S’il reussit, alors il ne fera pas ce
qu’il y a apres puisqu’il quitte. Sinon, il le fera.
il prend en parametre le path calcule precedemment et un tableau a deux
dimemsions vers chaque arguments exemple :
{"ls", "-l", "-a", ".", NULL}
ca tombe bien, c’est exectement ce qu’on a fait avec le str_to_wordtab.
et l’environnement sous forme d’un tableau.
*/
/*
et voila ! On a lance un programme a partir de notre minishell.
Maintenant, on a quelques builtins a realiser.
env, setenv et unsetenv. Le mieux serait de le faire avec des listes
chainees. Je vous ai appris a en faire dans un precedent cours.
Si vous n’etes pas a l’aise, vous pouvez utiliser des tableaux.
*/
/*
ETAPE 4 ENV
-> Si vous prenez la solution liste chainee (trop classe wahou), faites une
fonction qui transforme le char **env en t_list *env. Cette fonction
ressemblera a l’exo de piscine "my_params_in_list.c" (Jour 11).
Afficher cette liste.
-> Si vous choisissez de garder un tableau, afficher simplement ce tableau.
*/
/*
ETAPE 5 SETENV
liste chainee : ajouter un element a la liste. A la fin de la liste. Pas
tres difficile :) mais attention, vous devez verifier si l’element n’
existe pas deja et si c’est le cas modifier cet element.
tableau : ajouter un element a la fin du tableau. Pour ca, il va falloir
faire un realloc, c’est a dire free(env) (sauf si c’est le tableau de depart)
malloc(la taille du tableau d’avant + 1). pareil, si l’element existe,
il faut le modifier.
*/
/*
ETAPE 6 UNSETENV
liste chainee : parcourir sa liste, trouver (ou pas) l’element, l’enlever.
pop_elem_from_list (google :))
tableau : parcourir le tableau, trouver (ou pas) l’element, realloc le
tableau en enlevant l’elem.
*/
/*
ETAPE 7 CD
la, je me contenterait de vous dire "chdir". Et man. Et google.
*/
/*
Et voila, t’as un super minishell !
Merci, db0-lepage_b !
Bisous ? Non...? Ok.
*/