Dév un mini-shell en utilisant seulement des processus Linux

Signaler
Messages postés
29
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
14 janvier 2007
-
Messages postés
65
Date d'inscription
dimanche 12 janvier 2003
Statut
Membre
Dernière intervention
5 novembre 2010
-
MES CORDIALES SALUTAIONS A TS LES DEV DE CPPFRANCE.COM ET EN PARTICULIER AUX ADMINS DU SITE...

Chui plantée avec un TP dont le thème est dév un mini-shell sous Linux capable d'exe n'importe kelle cmd Linux(ds un 1er temps, ce minishell ne prend pa en charge des cmd en background ou des cmd exécutées en parallèle).

D'après le prof, le minishell doit répondre à l'algo suivant:
répéter
lire(cmd)
analyser et traiter la cmd
executer la cmd
jusqu'à (cmd=sortir)

Sachant ke je dois dév ce TP avec des processus seulement:
- cmt lire une commande?
- cmt distinguer le mot-clé de la commande de ses arg(s'il y en a)?

Merci d'répondre et chui ouverte à n'importe kelle solution ;-)!

Bonne prog!

7 réponses

Messages postés
78
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
23 avril 2010

Pour recupérer les lignes de comande tapées par un utilisateur dans une console en C regarde du coté de la fonction :
char * fgets (char * s, int n, FILE * fic)
un exemple pour lire le contenu d'une ligne de commande tapée par un utilisateur :

#include <stdio.h>
// ...
char temp[256];
while(fgets(temp,256,stdin) != NULL)
printf(temp);

donc ca c'est pour recupérer la ligne de commande tapée par un utilisateur pendant que ton programme de shell est en exécution.

Ensuite, si tu veux recuperer chaque mot de la ligne de commande utilise la fonction strtok;
char * strtok(char* chaine, char * delimiteur);

Sachant que le delimiteur entre chaque mot de la ligne de commande est un espace voivi un exemple d'utilisation avec fgets et strtok en meme temps :
#include <stdio.h>
#include <string.h>
// ...
char temp[256];
char tmpstrtok[256];
int i=0;

while(fgets(temp,256,stdin) != NULL)

{
while(tmpstrtok=strtok(i==0?temp:NULL," ")) // delimiteur ==> espace
{
printf("%s\n",tmpstrtok);
i++;
}
}
Avec ca tu recuperes chaque mot de la ligne de commande.
Voilà


Mess with the best, die like the rest
Messages postés
29
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
14 janvier 2007

Slt!
J'te remercie pr ta proposition, ton bout d'code a l'air très utile. Néanmoins, l'énoncé du TP exige ke je fasse appel à la programmation Shell (rien à voir avec la programmation C), dc pa d'include ni de printf...

Bonne prog!
Messages postés
452
Date d'inscription
jeudi 4 décembre 2003
Statut
Membre
Dernière intervention
19 décembre 2008
10
Ouais, mais bon, meme pour la programmation shell il te faudra faire des includes.

Vive le C
Tchao
[mailto:julienbj@hotmail.com Savon]
Messages postés
65
Date d'inscription
dimanche 12 janvier 2003
Statut
Membre
Dernière intervention
5 novembre 2010

Salut,

voilà une ebauche de solution, peut-être qu'elle t'interressera même si
j'imagine que tu as des cours si t'as un TP à faire dessus ^^



Vite fais :



while true
do
read ligne
if [ $ligne = sortie ]
then break
else echo "$ligne"
fi
done

Ensuite y'a un truc interressant comme par exemple:

ligne="commande arg1 arg2 arg3"
set $ligne
echo $# --> Renvoit le nombre de mot, ici 4
echo $1 --> Renvoit "commande"
echo $3 --> Renvoit "arg2"

Et enfin, pour éxécuter une commande :

cmd="date"
eval $date


Voilà, j'espère que ça pourra t'éclairer un peu...

G0ss3Yn... ( Bon coding a tous !)
Messages postés
65
Date d'inscription
dimanche 12 janvier 2003
Statut
Membre
Dernière intervention
5 novembre 2010

arf...

à la fin c'est :

eval $cmd

et pas eval $date, bien sur ^^

G0ss3Yn... ( Bon coding a tous !)
Messages postés
29
Date d'inscription
samedi 12 mars 2005
Statut
Membre
Dernière intervention
14 janvier 2007

Slt! D'abord, merci pr vos interventions...ça m'touche ke vous venez en aide à une "développeuse" en détresse ;-) ...néanmoins, ya qqch ki pue :

Sachant ke j'utilise le bash, ya t-il une cmd ki permet de créer un processus? ou bien fo t-il forcément faire appel à la fct fork? si c le cas, je crois ke je donnerai raison à la proposition de "theneoiceman" et j'dois revoir la remarke de "julienbj"...bref, ça sent le C :-(

Bonne prog!
Messages postés
65
Date d'inscription
dimanche 12 janvier 2003
Statut
Membre
Dernière intervention
5 novembre 2010

Sachant que dans les règles de création de processus du shell tu as 3 alternatives :



1 - Le processus enfant prends la main ( ex: [Machin]$ mozilla<entrée> )

2 - Le processus enfant s'execute en arriere-plan ( ex: [Machin]$ mozilla &<entrée> )

3 - Le processus enfant dit 'émancipé' ( ex: [Machin]$ mozilla &!<entrée> )



En 1, c'est ce qu'on connait d'habituel...

En 2, le processus enfant est lancé et nous permet quand même
d'interagir avec le processus parent (ton programme dans noter cas).
Seulement, si tu ferme ton programme, tous les processus enfant qu'il
aura lancé seront eux aussi fermé.

En 3, les processus enfants peuvent survivre à la mort du parent, c'est ce qu'il te faut à mon avis...



Voilà, cette méthode alliée à la commande "eval" devrait fonctionner...
J'suis en vacances et j'ai pas de Linux sous la main pour tester donc
tiens nous au courant ;)

G0ss3Yn... ( Bon coding a tous !)