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