Dév un mini-shell en utilisant seulement des processus Linux
cs_Leila83
Messages postés29Date d'inscriptionsamedi 12 mars 2005StatutMembreDernière intervention14 janvier 2007
-
12 févr. 2006 à 13:33
G0ss3Yn
Messages postés65Date d'inscriptiondimanche 12 janvier 2003StatutMembreDernière intervention 5 novembre 2010
-
15 févr. 2006 à 23:03
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 ;-)!
theneoiceman
Messages postés78Date d'inscriptionlundi 14 avril 2003StatutMembreDernière intervention23 avril 2010 12 févr. 2006 à 14:10
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 :
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à
cs_Leila83
Messages postés29Date d'inscriptionsamedi 12 mars 2005StatutMembreDernière intervention14 janvier 2007 12 févr. 2006 à 20:55
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...
cs_Leila83
Messages postés29Date d'inscriptionsamedi 12 mars 2005StatutMembreDernière intervention14 janvier 2007 15 févr. 2006 à 22:43
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 :-(
G0ss3Yn
Messages postés65Date d'inscriptiondimanche 12 janvier 2003StatutMembreDernière intervention 5 novembre 2010 15 févr. 2006 à 23:03
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 ;)