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

Rispondi quotando

