shell simple en appel système c: waitpid ne fonctionne pas

Je dois fabriquer un shell simple qui lit les commandes et les exécute dans l’ordre. condition ne change pas la forme de la fonction principale et la fonction execute doit être récursive. Le problème principal est qu’il semble que waitpid ne fonctionne pas. mais je sais, il y a tellement de problèmes dans mon code. s’il vous plaît laissez-moi savoir où je devrais commencer à partir ..

#include  #include  #include  #include  #include  #include  #define MAX 10 char cmmd[MAX][256]; int sp; char *argv[10]; int size; void ClearLineFromReadBuffer(void){ while(getchar() != '\n'); } void printCommands(){ size = sp+1; //print by moving stack pointer while(1){ if (sp==-1) break; printf("Command line : %s\n", cmmd[sp]); sp--; } printf("print end\n"); } void readCommandLines(){ int a = 0; //return of scanf while (1){ //write commends to cmmd untill get ctrl+d printf(">"); a = (scanf("%[^\n]s", cmmd[sp])); //take input to str untill get enter(scanf returns -1) if (a==-1) {sp--; break;} if (a==1) ClearLineFromReadBuffer(); if (a==0) {printf("error"); break;} sp++; } printf("\n"); } void readACommand(char *line){ //line takes ssortingng's name. int i=0; argv[i]=strtok(line," "); //i==0 while(strtok(line," ")!=NULL){ i++; argv[i]=strtok(NULL," "); } printf("%s",argv[0]); printf("%s",argv[1]); } void executeCommands(){ //Recursive function int n = sp; n++; printf("%d",n); printf("%s",cmmd[n]); char *cmd_line = cmmd[n]; //command line which child process will execute unsigned int child_pid; //fork() returns process id of child in parents process int status; //status takes return of child's exit() child_pid=fork(); if (child_pid != 0){ // Parents process printf("parents access"); waitpid(child_pid,&status,0); printf("***Process %d Child process %d DONE with status %x\n\n",getpid(),child_pid,status); sp++; if(sp<size) executeCommands(); } else if (child_pid == 0){ //fork() returns 0 in child process printf("***Process %d Executing Command %s",getpid(),cmd_line); readACommand(cmmd[n]); execve(argv[0],argv,NULL); printf("ERROR - not executing command \"%s\"\n",argv[0]); //can be printed because exec() failed } } int main(){ readCommandLines(); printCommands(); executeCommands(); return(0); } 

c’est le résultat. entrez la description de l’image ici

la façon dont vous marquez la chaîne est très fausse. Il y a beaucoup d’appels strtok , et votre boucle peut être une boucle infinie puisque vous appelez strtok dans la boucle avec la chaîne d’initialisation, pas NULL

De plus, vous ne définissez pas la valeur NULL après le dernier argument, ce qui est requirejs par execv pour savoir quand les arguments sont épuisés (aucune taille n’est transmise)

Voici un exemple autonome et une routine readACommand appropriée:

 #include  #include  char *argv[100]; void readACommand(char *line){ //line takes ssortingng's name. int i=0; argv[i]=strtok(line," "); //i==0 while(argv[i]!=NULL){ argv[++i]=strtok(NULL," "); } } int main() { char line[] = "this is a command"; char **ptr=argv; readACommand(line); while(*ptr != NULL) { printf("Arg: %s\n",*ptr); ptr++; } return 0; } 

exécuter (détecter le pointeur NULL à la fin):

 Arg: this Arg: is Arg: a Arg: command