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