Newsgroup: it.comp.os.linux.development
Titolo: execvp

Salve a tutti
e' la prima volta che scrivo.
Ho un problema con questa funzione in linux.
passo a questa funzione degli argomenti da un vettore char es:
printf("inserisci il percorso\n");
scanf("%s", percorso);
char *vettore[]={"dir",percorso,NULL};
execvp("dir",vettore);
e funziona...
mi fa vedere il listato della directory passata tramite percorso che
l'utente digita.
Funzona bene anche con cp, mkdir etc...
ma come faccio a reindirizzare l'output ? Tipo
printf("inserisci il percorso\n");
scanf("%s", percorso);
printf("inserisci il nome del file\n");
scanf("%s", contenitore);
char *vettore3[]={"dir",percorso>contenitore,NULL};
execvp("dir",vettore3);
Penso sia sbagliato il percorso>contenitore. Ma non riesco a
risolverlo.
Grazie mille per l'aiuto.
ps: l'errore sembra sia qualcosa con il casting,,,
-- 
chad9
------------------------------------------------------------------------
chad9's Profile: 
http://www.linuxforum.it/member.php?userid=1236
View this thread: 
http://www.linuxforum.it/showthread.php?t=22751

 ps: l'errore sembra sia qualcosa con il casting,,,
oh, quello e' solo un dettaglio...
ilSimo
-- 
now playing: 
Have no fear, Rebellion is here!
                                Gammaray - Rebellion In Dreamland

 ps: l'errore sembra sia qualcosa con il casting,,,
oh, quello e' solo un dettaglio...""
Vedi di fare lo spiritoso da un altra parte...


Ciao e grazie della risposta.
La differenza tra C e Shell la consco... :) Anche perche' allora
dovremmo affrontare discorsi tipo COMPILATORI E TRADUTTORI.... ma non e'
questo il caso...
A me interessava solamente il fatto ( siccome voglio SIMULARE una shell
in C ) di come si puo' usare la pipe di indirizzamento > all'interno din
una funzione della famiglia "exec" e piu' in paticolare la "execvp" che
mi prende argomenti da un vettore... TUTTO QUA! 
Grazie ancora. Ne' piu' ne' meno.


 Vedi di fare lo spiritoso da un altra parte...
BTW, quella mi sembrava una risposta serissima...
se non sai perché {"dir", percorso>contenitore, NULL} non potrà mai essere
quello che vuoi, allora hai ben altri problemi.
ps: già che stai studiando, impara a quotare
-- 
By ZeD

 Grazie ancora. Ne' piu' ne' meno.
Mi dispiace che la prima volta che ti affacci a Usenet tu abbia fatto
questa
esperienza. Comunque non desistere. Usenet e' una cosa preziosa.
Comunque ti hanno detto la verita. Anche io non ti avrei risposto, vista la
mole di argomenti propedeutici alla risposta che sono necessari da esporre,
ma voglio fare uno sforzo per incoraggiarti.
Prima di tutto il tuo dubbio sul cast:
char *vettore3[]={"dir",percorso>contenitore,NULL};
Se ti soffermi a pensare su CHI interpreta l' espressione
(percorso>contenitore) scoprirai che non e' la shell, ma il compilatore C
che la valuta come espressione condizionale, come quelle che si mettono in
if() ...
In C, linguaggio che ammette l' aritmetica dei puntatori, e' perfettamente
lecito chiedersi se un puntatore e' maggiore o uguale ad un altro e la
risposta e' un intero 0 o 1. L' errore SINTATTICO e' assegnare un intero
risultante questa espressione a un puntatore a char.
Rispondere agli errori SEMANTICI scoraggia pero.
Hai detto che vuoi simulare una shell, quindi immagino che la furbata:
execvp("/bin/bash","-c",comandodaeseguire, ">", filedioutput);
non sia ammessa!
Per simulare una shell devi prevedere di  gestire in autonomia cio' che
le shell attribuiscono al simbolo '>' per redirezionare il flusso, cioe
dei leggere:
man 2 pipe
e
man 2 fork
dando per scontato che open di un file gia' la conosci.
Un interprete interattivo che non usera' fork potra eseguire solo un
comando. se hai notato le exec* in caso di successo non ritornano al
programma che le ha lanciate, ma sostituiscono il programma in esecuzione
con il nuovo. In questo caso pipe non servirebbe, solo dovresti fare
una open del file di redirezione, usare bup2 (man 2 dup2)  per
redirezionare
stdout (file descriptor numero 1) sul file aperto, accertarti che non sia
settato il flag close-on-exec e quindi eseguire la execvp.
Se l' interprete deve tornare pronto per gestire altri comandi, execvp DEVE
essere eseguita in processo separato e quindi ... fork()
Veramente di piu' non posso. C' e' un intero capitolo sul libro di
Richard Stevens da sciropparsi (l' intero libro e' da sciroppare).
Ciao
Roberto
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 execvp("/bin/bash","-c",comandodaeseguire, ">", filedioutput);
Neache funzionera'.
">" non e' un argomento passato. e' interpretato dall' interprete.
Ci vorrebbe un' altra istanza di bash... ma non mi va di approfondire.
Ciao
roberto


 execvp("/bin/bash","-c",comandodaeseguire, ">", filedioutput);
Forse questo puo' funzionare:
execvp("/bin/bash","-c","ls -la > filedioutput");
Ciao
Roberto.


 Vedi di fare lo spiritoso da un altra parte...
almeno hai scoperto il problema "di casting"?
e' un dettaglio perche' appena ti rendi conto della cazzata che hai fatto
quell'errore scompare.
ilSimo
-- 
now playing: 
Come to the mass of chaos 
Summon the nameless One 
Celebrte his gory return 
Death now grinds his schyte 
                                Domine - The Mass Of Chaos

 Grazie ancora. Ne' piu' ne' meno.
l'altra soluzione proposta e' usabile.
altrimenti devi giocare coi file descriptor.
ilSimo
-- 
now playing: 
The Finger of Scorn, it points to us all
The Finger of Scorn, it points to our fall
                                Cirith Ungol - Finger Of Scorn

senti rompipalle ti ripeto per l'ultimo volta di non rompere i coglioni.
forse sei tu che non conosci le funzioni tipo exec o system.... o
sbaglio.
Cmq se devi rispondere rispondi in maniera intelligente ( ma non ci
sono moderatori ? )... Ho chiesto solo se si poteva utilizzare un
operatore di reindirizzamento dentro funzioni exec. E nient'altro. E' un
forum. Quindi si ricevono risposte non deliri di onnipotenza.... 
Grazie roberto, vi saluto e non mi vedete piu'.
Scusate se sono entrato nel vs clan per chiedere una indicazione...


 E' un forum. Quindi si ricevono risposte non deliri di onnipotenza....  
no, e' USENET. puoi chiedere, nessuno e' obbligato a risponderti.
ilSimo
-- 
now playing: 
Why am I born
Will I fall to rise again
Another crusifixion for
Another holy war
Can't stop what going on
                                Blind Guardian - Another Holy War

 char *vettore3[]={"dir",percorso,NULL};
Usa popen invece di execvp (ometto il check degli errori, "man popen" 
per vedere cosa fa popen in generale), dopo le linee quotate aggiungi 
questo:
char buffer[255];
FILE *out = fopen(contenitore, "w");
snprintf(buffer, sizeof(buffer), "dir %s", percorso);
FILE *in = popen(contenitore, "r");
while (fgets(buffer, sizeof(buffer), in))
    fwrite(buffer, 1, strlen(buffer), out);
pclose(in);
fclose(out);

 
meno male.
-- 
SF
Games are very educational. Scrabble teaches us vocabulary, Monopoly teaches 
us cash-flow management, and Dungeons & Dragons teaches us to loot dead bodies.