PDA

View Full Version : [C] Passare piu parametri a execlp()


vv1984
24-01-2008, 10:55
Ciao a tutti, sto facendo un programma in unix che lanci piu
comandi bash ognuno dei quali con piu di un parametro.
Non so come passare gli argomenti a execlp.

Ho un array di stringhe chiamato "parametri" che contiene
i vari parametri che voglio passare al mio comando.

char *comando;
char *parametri[10];

Come passo l'array di parametri a execlp dal momento che non
posso passargli direttamente l'array "parametri", ma devo invece passargli
piu' stringhe?

Pensavo di dover usare stdarg, ma non e' quello il punto, perche' pur avendo
un array di parametri gia definito non ho idea di come passarlo a execlp..

Ovviamente non voglio fare cosi: execlp("ls","ls","-l","-1",(char *) NULL);
perche' i parametri li passo da riga di comando come un unica stringa
che poi scompongo in token e inserisco in parametri[]

grazie in anticipo,
Blob

principVo
24-01-2008, 10:59
devi usare execlp per forza?
non puoi usare execvp?

vv1984
24-01-2008, 11:01
devi usare execlp per forza?
non puoi usare execvp?

Si, e' un esercizio di un esame..
Sono purtroppo costretto ad usare execlp. Infatti
con execvp andavo assai piu tranquillo.

Penso ci sia il modo anche con execlp
dal momento che e' indicato nella consegna..

grazie

cionci
24-01-2008, 13:45
E' un serio problema...ma molto serio. Non riesco sinceramente a farmi venire in mente come potresti dimensionare il numero di parametri a run time.

Hai un limite al numero dei parametri ?

ilsensine
24-01-2008, 13:59
char *comando;
char *parametri[10];

Se il numero di parametri è fisso, non hai altra strada che:

execlp(comando, comnando, parametri[0], parametri[1],
parametri[2], ...ecc. fino a parametri[9], NULL);

L'importante è che il primo puntatore dopo l'ultimo parametro valido sia NULL.

E' un esercizio del cavolo se posso permettermi; execlp è un wrapper per execve, che è una funziona che ti potrebbe andar bene. In sostanza, stai usando un wrapper per execve per cercare di emulare...la execve stessa!

Un obrobrioso metodo alternativo è concatenare il comando e i suoi parametri in una unica stringona, e usare execlp così:
execlp("/bin/bash", "/bin/bash", "-c", obrobrio, NULL);

cionci
24-01-2008, 14:01
Un obrobrioso metodo alternativo è concatenare il comando e i suoi parametri in una unica stringona, e usare execlp così:
execlp("/bin/bash", "/bin/bash", "-c", obrobrio, NULL);
In effetti dovrebbe essere il modo più semplice.

vv1984
24-01-2008, 14:30
Se il numero di parametri è fisso, non hai altra strada che:

execlp(comando, comnando, parametri[0], parametri[1],
parametri[2], ...ecc. fino a parametri[9], NULL);

L'importante è che il primo puntatore dopo l'ultimo parametro valido sia NULL.

E' un esercizio del cavolo se posso permettermi; execlp è un wrapper per execve, che è una funziona che ti potrebbe andar bene. In sostanza, stai usando un wrapper per execve per cercare di emulare...la execve stessa!

Un obrobrioso metodo alternativo è concatenare il comando e i suoi parametri in una unica stringona, e usare execlp così:
execlp("/bin/bash", "/bin/bash", "-c", obrobrio, NULL);

E' vero, e' un bell esercizio del cavolo..
Pero' mi interessava (a parte risolvere l'esercizio seguendo la consegna, perche' son pignoli.. ) sapere in che modo passare un numero variabile
di parametri alla funzione execlp.. Non c'e proprio modo?

Non avevo forse specificato che devo passare un numero variabile di parametri
sotto forma di stringa del tipo "-l -1 -a"




grazie e scusate la rottura di scatole..

ilsensine
24-01-2008, 14:45
E' vero, e' un bell esercizio del cavolo..
Pero' mi interessava (a parte risolvere l'esercizio seguendo la consegna, perche' son pignoli.. ) sapere in che modo passare un numero variabile
di parametri alla funzione execlp.. Non c'e proprio modo?
In assembler, forse.
In c non mi risulta, non che io sappia.

trallallero
24-01-2008, 16:23
l'unica cosa che mi viene in mente (ma son fuso e me ne sto andando quindi la butto li, magari da idea nasce idea) è una funzione
call_execlp( int count, ... )
all'interno della quale prendi con va_list, va_start, v_end ... tutti i parametri dinamici e chiami poi la execlp

spero di aver capito il tuo problema e di non aver detto 'na minchiata :D