Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [C]esercizio con exec

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

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303

    Moderazione

    Per postaer il codice, utilizza gil appositi tag [*CODE] e [*/CODE] (senza l'asterisco rosso). In questo modo il codice viene formattato mantenendo indentazione e stile del font per migliorarne la lettura.

    Ho modificato io il tuo post in proposito.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    ah scusami...grazie per la correzione...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.