J'ai finalement résolu mon problème pour le programme moncd précédent merci pour les explications, elles m'ont servi de bcp pour la compréhension.
Par ailleurs, si j'ai un programme C qui a pour but d'exécuter le fonctionnement d'un mini shell comment pourrais je le modifier afin de rajouter la possibilité de lancer des processus en arrière-plan quand la ligne de commande se termine par un & ? L'indication est de ne pas faire le wait dans le parent.
Le but c'est de pouvoir faire un mini shell complet à partir de celui ci voilà pourquoi j'avais besoin de créer un programme moncd pour simuler le fonctionnement de cd.
Le programme est le suivant(il lit une ligne de commande, la découpe avec la fonction découper, fabrique un nouveau processus avec fork et tente d'y lancer la commande en allant chercher un fichier du même nom dans chacun des répertoires indiqué par PATH.):
# include <stdio.h># include <stdlib.h># include <unistd.h># include <sys/types.h># include <sys/wait.h># include <assert.h># include <string.h>enum{MaxLigne=1024,// longueur max d'une ligne de commandesMaxMot=MaxLigne/2,// nbre max de mot dans la ligneMaxDirs=100,// nbre max de repertoire dans PATHMaxPathLength=512,// longueur max d'un nom de fichier};voiddecouper(char*,char*,char**,int);# define PROMPT "? "intmain(intargc,char*argv[]){charligne[MaxLigne];charpathname[MaxPathLength];char*mot[MaxMot];char*dirs[MaxDirs];inti,tmp;/* Decouper PATH en repertoires */decouper(getenv("PATH"),":",dirs,MaxDirs);/* Lire et traiter chaque ligne de commande */for(printf(PROMPT);fgets(ligne,sizeofligne,stdin)!=0;printf(PROMPT)){decouper(ligne," \t\n",mot,MaxMot);for(i=0;mot[i]!=0;i++);if(mot[0]==0)// ligne videcontinue;tmp=fork();// lancer le processus enfantif(tmp<0){perror("fork");continue;}if(tmp!=0){// parent : attendre la fin de l'enfantwhile(wait(0)!=tmp);continue;}// enfant : exec du programmefor(i=0;dirs[i]!=0;i++){snprintf(pathname,sizeofpathname,"%s/%s",dirs[i],mot[0]);execv(pathname,mot);}// aucun exec n'a fonctionnefprintf(stderr,"%s: not found\n",mot[0]);exit(1);}printf("Bye\n");return0;}/* decouper -- decouper une chaine en mots */voiddecouper(char*ligne,char*separ,char*mot[],intmaxmot){inti;mot[0]=strtok(ligne,separ);for(i=1;mot[i-1]!=0;i++){if(i==maxmot){fprintf(stderr,"Erreur dans la fonction decouper: trop de mots\n");mot[i-1]=0;}mot[i]=strtok(NULL,separ);}}
J'ai pensé à introduire au niveau du parent l'instruction:
if(*mot[i-1]!='&')
Mais l'exécution me produit une erreur.
roger@roger-1005PX:~/Bureau$ gcc -g -Wall shell.c -o shell
roger@roger-1005PX:~/Bureau$ ./shell
? #notre mini shell
? echo essai #test avec echo
? essai
? sleep 10&#test arrière plan
sleep: intervalle de temps «&» incorrect.Saisissez « sleep --help » pour plus d'informations.
# Fonction mini shell
Posté par roger91 . En réponse au message Commande qui ne fonctionne pas. Évalué à 1. Dernière modification le 03 décembre 2015 à 23:31.
J'ai finalement résolu mon problème pour le programme moncd précédent merci pour les explications, elles m'ont servi de bcp pour la compréhension.
Par ailleurs, si j'ai un programme C qui a pour but d'exécuter le fonctionnement d'un mini shell comment pourrais je le modifier afin de rajouter la possibilité de lancer des processus en arrière-plan quand la ligne de commande se termine par un & ? L'indication est de ne pas faire le wait dans le parent.
Le but c'est de pouvoir faire un mini shell complet à partir de celui ci voilà pourquoi j'avais besoin de créer un programme moncd pour simuler le fonctionnement de cd.
Le programme est le suivant(il lit une ligne de commande, la découpe avec la fonction découper, fabrique un nouveau processus avec fork et tente d'y lancer la commande en allant chercher un fichier du même nom dans chacun des répertoires indiqué par PATH.):
J'ai pensé à introduire au niveau du parent l'instruction:
Mais l'exécution me produit une erreur.
Merci d'avance ...