Newsgroup: it.comp.lang.c
Titolo: come fare la execl?

Buongiorno a tutti,
sto scrivendo un programma in c sotto ambiente linux.
Avrei bisogno che il mio programma eseguisse un altro programma (io
uso la funzione exexlp) ma non riesco a passare i parametri
correttamente.
Potete aiutarmi per favore?
LA riga di comando che vorrei chiamare è:
                                 nc -v 
www.google.it
 80 < http_req.txt
Questo è il codice:
(Argv[2]="
www.google.it
")
				printf("\nHTTP REQUEST\n");
				pid=fork();
				if(pid==0)//Figlio
				{
					execlp("nc","nc","-v",argv[2],"80"," < http_req.txt",NULL);
					printf("ERRORE EXECL");
				}
Dove sbaglio? devo usare un altro tipo di exec??
come vanno scritti i parametri della funzione correttamente?
Grazie mille
:)

 execlp("nc","nc","-v",argv[2],"80"," < http_req.txt",NULL);
Se vuoi usare la ridirezione stile shell usa la funzione system():
     system("nc -v 
www.google.it
 80 < http_req.txt");
Se invece devi usare le funzioni exec() devi aprire lo stdin dal file 
http_req.txt (con la freopen() o le funzioni dup() e/o dup2().
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

  nc -v 
www.google.it
 80 < http_req.txt
Sicuro di non volere fare una pipe?
< http_req.txt *non* e' un parametro del programma, ma e' una cosa
gestita dalla shell. Questo ti lascia due famiglie di possibilita':
La prima e' usare popen/pclose per aprire nc e scrivergli dentro il
contenuto di http_req. Questo lo fai con poche righe, ma passi per una
shell (cosa che puo' essere a tuo gusto e in dipendenza del problema
cosa buona o cosa meno buona. 
Alternativamente puoi passare per la trafila classica:
1. fork
2. dup2
3. exec 
int main(int argc, const char* argv[]) {
    pid_t pid;
    int fd[2];
    if(pipe(fd) < 0) {
        err_flag = PIPE_ERROR;
        goto error;
    }
    if((pid=fork()) < 0) {
        err_flag = FORK_ERROR;
        goto error;
    } else if (pid > 0) {
        close(fd[0]);
        write_file(argv[1], fd[1]);
    } else {
        close(fd[1]);
        dup2(fd[0], STDIN_FILENO);
        execlp("cat", "cat", NULL); /* metti la cosa appropriata */
    }
    return EXIT_SUCCESS;
error:
        /* ... */
    return EXIT_FAILURE;
}
-- 
-riko

Grazie a tutti per le risposte...
Ho provato la prima soluzione  system(comando) e riesco ad eseguire
tutto correttamente...
Volevo chiedervi se c'è qualche vantaggio ad usare la seconda opzione
quella con la fork dup2 e  execl
e se potreste spiegarmi a che serve la dup2 e come si usa (in che
occasioni)
ho provato a cercarla dal manuale... da quel che ho capito, duplica il
contenuto di un puntatore a file... mmmm (Non ho capito benissimi :P )
Grazie ancora
DjMaD

 quella con la fork dup2 e  execl
La chiamata a system avvia un nuovo processo in cui viene fatta partire 
una shell alla quale viene passato il tuo comando. A parte il fatto che 
richiede qualche risorsa in piů, forse la cosa piů pericolosa č che se 
metti nella riga di comando dei parametri che vengono dall'input 
dell'utente devi fare molta attenzione ai caratteri speciali 
interpretati dalla shell. E' molto facile che con un input "ben 
assestato" l'utente "malvagio" riesca a fare eseguire alla shell 
qualunque cosa lui voglia. Questo in certi casi puň portare a gravi 
problemi di sicurezza.
E.

 E.
Il programma lo dovrei usare solo io... :)
Grazie mille per tutti i consigli...

 Il programma lo dovrei usare solo io... :)
Ne ho visti tanti che sono partiti cosi'. :P
Dopo di che, se lo fai per imparare, impara ad usare qualche syscall in
piu' piuttosto che sparare tutto in system senza nemmeno capire cosa fa
cosa e perche'.
Se lo fai perche' ti serve, C non e' il linguaggio piu' pratico per
questo genere di cose. 
-- 
-riko

On 15 Mar, 23:06, 
r...@despammed.com
 (Enrico Franchi) wrote:

:P Grazie mille...
sto lavorando alla tesi :P però sai consigliarmi qualche guida
riguardante le sys call? perchè non riesco a trovare nulla di buono
io :P
Grazie ancora
Buona giornata

 io :P
Mah. Puoi leggerti le man pages, il gapil. O un libro classico Unix
Network Programming o Advanced Programming in the Unix Environment.
-- 
-riko

 riguardante le sys call?
Spero non la tesi di Informatica!? Scusami eh, ma darei per scontato
che un Informatico *laureando* le sappia trovare da solo certe
informazioni, e soprattutto che conosca i processi a menadito.
Comunque, non sono fatti miei, era un riflessione ... amara!

 informazioni, e soprattutto che conosca i processi a menadito.
Non ti stupire piu' di niente. 
Nota a margine, in molti corsi di laurea fanno praticamente solo Java.
Il che potrebbe rendere possibile che nel corso di studi uno non abbia
mai affrontato il C e la programmazione di sistema in C (ma lo abbia
fatto in Java).
Nota per esempio che un celebre libro di sistemi operativi (anche ben
fatto, per inciso) usa pesantemente Java negli esempi.
Mi verrebbe poi da dire che uno studente curioso probabilmente ha
approfondito anche qualcosa di diverso, ma dopotutto il tempo e' finito
e la curiosita' si puo' espletare solo su un numero finito di argomenti.
-- 
-riko


Anche il tempo per i corsi di laurea è finito. :) Si tratta
semplicemente di decidere dove orientarsi.
Personalmente credo che adesso come adesso abbiano messo in testa alle
università che devono "preparare al mondo del lavoro" e altre robe
simili, invece che dare conoscenza. Questo porta a fare poca teoria e
a studiare il Java. Mi dispiace per questi neolaureati che vengono
buttati a palate in uffici strapieni, pagati nulla e trattati male,
come veri e propri "muratori del software" - devono sapere giusto lo
stretto indispensabile per tirare su una "applet" o "portlet" o
qualche altra javeria. Dall'altro lato non posso che gioire perchè chi
ha studiato informatica qualche annetto fa, invece, sarà praticamente
irraggiungibile come conoscenza/esperienza dalle nuove generazioni di
programmatori, il che significa lavoro anche se fuori età :)
Oppure magari è tutto un mio viaggio mentale e non ho capito nulla
della vita.

 a studiare il Java. 
Non saprei. Noi siamo delle mosche bianche e non seguiamo questa strada.
Comunque anche guardandoci in giro non e' questione IMHO di "preparare
al mondo del lavoro". Il problema e' che gli studenti arrivano come
arrivano e spesso non hanno la voglia che avevamo (anche se mi sa che
fra me e te ci sta una generazione almeno) noi. 
Io al momento ho tenuto i laboratori di C++ al primo anno. Che dire, a
me Java non piace, ma mi chiedo seriamente se non avrei fatto un lavoro
migliore. Il fatto e' che C++ e' maledettamente complicato da apprendere
bene. Ci sono un dannato fottio di dettagli da spiegare (o da far cadere
per magia) e alla fine si va di compromessi e raffinamenti successivi.
Aggiungi che arrivano studenti che:
1. non hanno mai programmato e non hanno idea di come fare
2. hanno programmato in x, y, z e si sentono bravi (ma sanno poco)
3. hanno programmato in x, y, z e *sono* bravi, ma tu devi fare in modo
   che anche 1 e 2 (che sono la maggior parte) possano andare avanti.
Java e' un po' piu' lineare. Basterebbe non presentarlo come la panacea
a tutti i mali come molti Javisti fanno. Effettivamente a me C++ piace,
ma ne riconosco tutta la complessita'.
Sfortunatamente C e' escluso come "primo linguaggio" perche'
apparentemente si vuole fare OOP from day 1. Che potrebbe forse anche
avere un suo senso, forse. Boh. Fatto sta che questo e' qualcosa che
fanno un po' tutti, a torto o a ragione. Io purtroppo non sono ancora
riuscito a formarmi una posizione unbiased.
-- 
-riko