Grazie per l' aiuto innazitutto
Allora il problema delle stringhe l' ho risolto, era come dicevi te, ora sono riuscito a farlo anche tramite solo puntatori ( al prof piace di più xD ) però ora non riesco a fare una cosa, però a questo punto dovrò spiegare tutto il programma xD:
Io dovrei simulare la shell di linux, il suo terminale, quindi devo ricevere in ingresso una stringa e eseguirla come comando ( esempio: ps -aux ). Devo utilizzare la fork e l' exec. Quindi io dovrò fare un Ciclo infinito ( simula la shell ) in cui richiedo in ingresso sempre una stringa, da lì distinguere il comando e i parametri , separati dagli spazi " " , dopodichè devo creare un figlio ( fork() ) e fargli fare una exec nella quale eseguirà il comando con i parametri inseriti nell' input. Il problema è che non ho capito il comando exec , non so quale tra le funzione exec ( execlp , execl , execv ec... ) devo usare e in che modo, cioè, gli posso passare direttamente il comando o gli devo dare il path? , ho fato il programma e funziona solo che non esegue i programmi xD. Poi un' altra cosa nell' exec, devo passargli i parametri con tipo char* const char* oppre una stringa char* contenente tutti i parametri separati dallo spazio.
#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 == -1)
std::cout <<" Creazione figlio fallita "<<std::endl;
else if ( pid == 0) {
strcpy(percorso,"/bin/");
Path(path,comando,percorso);
if ( execv(path,parametri) == -1 ){
strcpy(percorso,"/bin/sh/");
Path(path,comando,percorso);
if ( execv(path,parametri) == -1 )
execv(comando,parametri);
}
_exit(0);
}
else
wait(NULL);
}
else if ( verifica == 2 ) {
pid = fork();
if (pid == -1)
std::cout <<" Creazione figlio fallita "<<std::endl;
else if ( pid == 0) {
strcpy(percorso,"/bin/");
Path(path,comando,percorso);
if ( execv(path,parametri) == -1 ){
strcpy(percorso,"/bin/sh/");
Path(path,comando,percorso);
if ( execv(path,parametri) == -1 )
execv(comando,parametri);
}
_exit(0);
}
else
wait(NULL);
}
}
return 0;
}