L'esercizio è scrivere un programma che supporti il lancio di eseguibili(specificandone il path) che richiedono opzioni e/o argomenti(passati dalla command line).
esempio:
da terminale: ./a.out /bin/ls -l
deve eseguire ls -l
vorrei sapere se secondo voi la mia soluzione è corretta...sebra che funziona però magari ci sono delle imperfezioni...testato su ubuntu 7.10 con gcc 4.1.3
codice:
#include <unistd.h>
#include <sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>
#include <stdio.h>
int main(int argc, char **argv, char **envp){
int pid;
int s;
int i;
char *tmp;
char *arg[argc+1];
if(argc<=1){
perror("Nessun argomento sulla command line");
exit(-1);
}
tmp=argv[1];//tmp prende il path dell'eseguibile da lanciare es: tmp=/bin/ls
tmp=(char *)basename(tmp); //tmp prende solo il nome dell'eseguibile da lanciare...es: diventa tmp=ls
printf("\n*****Opzioni e Argomenti salvati in arg*****\n\n");
for(i=1;i<argc;i++){
if(i==1){
*(arg+(i-1))=tmp; //imposta il primo elemento di arg con il nome dell'eseguibile(vedere colonna COMMAND in ps -u)
}
else{ //il resto sono opzione e argomenti
*(arg+(i-1))=argv[i];
}
}
*(arg+(i-1))=NULL; //quando esce dal for setta ultimo argomento di arg a NULL
for(i=1;i<argc;i++){ //stampa tutti gli elementi salvati in arg
printf("%s\n", *(arg+(i-1)));
}
printf("\n*****************************\n");
pid=fork();
if(pid<0){ //errore nella fork
perror("fork");
exit(-1);
}
else if(pid==0){ //processo figlio
execv(argv[1], arg); //argv[1] indica il path dell'eseguibile da lanciare, arg indica il nome, le eventuali opzioni e gli argomenti
//execl(argv[1], (char *)basename(argv[1]), argv[2], argv[3], 0);
perror("exec error");
exit(-1);
}
//PADRE...
wait(&s);
printf("padre esce\n");
return 0;
}