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;
}