Salve,
Mi e' stato assegnato come compito di simulare la shell del terminale di Linux ( ho come distribuzione ubuntu 12.10 ). Quindi devo fare un while infinito in cui ricevo in ingresso una stringa e poi , distingudendo il comando dai parametri, devo chiamare una fork in cui il figlio dovrà fare una exec con il comando ricevuto e i parametri passati ( lo devo fare così da esercizio ). Il programma che ora incollerò è funzionante o, per meglio dire, funziona con certi comandi del tipo "ps -aux" , "ss" , "free" , free -m , ec.. però non li esegue tutti:
- se scrivo "ls" vai in errore
- se scrivo "help" non lo esegue come se non trovasse il comando
e altri comandi
Il problema molto probabilmetne è che non conosco il percorso dove si trovano questi comandi perchè io ho messo come unici percorsi /bin/comando e /usr/bin/comando. Potreste dirmi se ci sono altre cartelle dove stanno i comandi da terminale o se c'è un modo diverso , un approccio diverso per utilizzare l' exec? grazie mille
codice:#include <string.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> #include <iostream> typedef char Stringa[100]; int DistinguiComando(char*); void DistinguiParametri(int*,char**); void Path(char* path,char* comando,char *); int DistinguiComando( char * comando){ char lettera; int pos = 0; int continuo = 0; while ( (lettera = getchar() ) != '\n' ) { continuo = 1; if (lettera == ' ') break; else comando[pos++] = lettera; } if ( continuo == 1 && lettera == '\n' ){ comando[pos] = '\0'; return 2; } if (continuo == 1) { comando[pos] = '\0'; return 1; } else return 0; } void DistinguiParametri ( int *dimensione, char ** par ) { char lettera; *dimensione = 0; int nextChar = 0; par[(*dimensione)] = new char[15]; while ( (lettera=getchar() ) != '\n') { if (lettera == ' '){ par[*dimensione][nextChar] = '\0'; nextChar = 0; (*dimensione)++; par[(*dimensione)] = new char[15]; } else { par[(*dimensione)][nextChar] = lettera; nextChar++; } } (*dimensione)++; } /*void DistinguiParametri(int *dimensione, char* par) { char lettera; int pos = 0; while ( (lettera = getchar()) != '\n' ) { par[pos++] = lettera; } }*/ void Path(char* path,char* comando,char* percorso) { int pos=0; int i = 0 ; while ( percorso[i] != '\0' ) path[pos++] = percorso[i++]; i= 0; while ( comando[i] != '\0' ) path[pos++] = comando[i++]; path[pos] = '\0'; } int main() { int pid; while (1) { char *comando = new char[15]; char ** parametri = new char*[10]; char *path = new char[100]; char *percorso = new char[100]; int *dimensione = new int; int verifica = DistinguiComando(comando); if ( verifica == 1) { DistinguiParametri(dimensione,parametri); pid = fork(); if ( pid == 0) { strcpy(percorso,"/bin/"); Path(path,comando,percorso); if ( execv(path,parametri) == -1 ){ strcpy(percorso,"/usr/bin/"); Path(path,comando,percorso); if ( execv(path,parametri) == -1 ) { strcpy(percorso,"/usr/lib/apt/solvers/"); Path(path,comando,percorso); if ( execv(path,parametri) == -1 ) { strcpy(percorso,"/usr/lib/"); Path(path,comando,percorso); execv(comando,parametri); } } } _exit(0); } else wait(NULL); } else if ( verifica == 2 ) { pid = fork(); if ( pid == 0) { strcpy(percorso,"/bin/"); Path(path,comando,percorso); if ( execv(path,parametri) == -1 ){ strcpy(percorso,"/usr/bin/"); Path(path,comando,percorso); if ( execv(path,parametri) == -1 ) { strcpy(percorso,"/usr/lib/apt/solvers/"); Path(path,comando,percorso); if ( execv(path,parametri) == -1 ) { strcpy(percorso,"/usr/lib/"); Path(path,comando,percorso); execv(comando,parametri); } } } _exit(0); } else wait(NULL); } } return 0; }

Rispondi quotando
. 