Newsgroup: it.comp.os.linux.development
Titolo: exec() e stdout ...

Ciao a tutti...
...sempre io con le mie domande :)
Sempre riguardo la programmazione di base in *nix ...
Dunque...
"Scrivere un programma C “elenca”, che prende come argomento il nome di 
un file ed esegue il corrispettivo di “ls ­l > file”.
Ad esempio, “elenca prova.txt” scrive il risultato di “ls ­l” nel file 
prova.txt"
Ho letto sullo Stevens, ho provato a cercare qualcosa con BigG, ma 
niente... non capisco :(
Cosa non capisco ?
Come diavolo si fa, dopo aver lanciato un "programma" con una exec() a 
redirigere lo stdout su un file.
Se faccio execl("/bin/ls", "ls", "-l", NULL) poi come diavolo scrivo il 
"risultato" in un file ?
Studiando le exec() ho capito che se apro un file prima di chiamare una 
di esse, tale file resta aperto e il descrittore è nella disponibilità 
del programma (chiamato da exec) che sostituisce il chiamante in memoria;
per questo avevo pensato di fare una fd=open(argv[1], O_CREAT) prima di 
lanciare la execl...
... e poi ? devo industriarmi con la read da stdout_fileno e write sul 
file passato in argv[1] ?
Come come come come ??? Lanciatemi un salvagente! :)

 Come come come come ??? Lanciatemi un salvagente! :)
Aspeeeeeeeeeeeeeeeeee....
ho capito che forse risolvo con dup2()... mmm... ma come ? :)

 
no, man popen

 no, man popen
e... ma non *devo* usare le pipe ...


puoi usare la freopen().
Per esempio:
  if ((pid = fork()) == 0) {
	/* Child */
         freopen("mio_file.txt", "w", stderr);
         execl("/bin/ls", "ls", "-l", NULL);
  } else .......
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

 e... ma non *devo* usare le pipe ...
mica c'era scritto nella tua richiesta...
man freopen 

 mica c'era scritto nella tua richiesta...
ehm... hai ragione :)

  } else .......
Ciao Giovanni :)
Ho provato a fare quello che mi hai suggerito, e funziona... :)
(ho messo però stdout al posto di stderr)
Ma senza utilizzare la freopen(), come si fa ad ottenere lo stesso 
risultato utilizzando la dup2() (con la open(), read() e write()) ?
Chiedo questo perchè nell'ultima "pagina" delle slide degli esercizietti 
che sto facendo, c'è scritto: "suggerimento per l'esercizio X (questo 
che ho postato): utilizzare la dup2()".
Ora, io con la dup2() c'ho anche provato... ma non ci riesco... :(
Ho fatto:
fd=open(argv[1], O_RDWR | O_CREAT);
newfd=dup2(STDOUT_FILENO, fd);
execl("/bin/ls", "ls", "-l", NULL);
[qui che ci metto ? una read seguita da una write su newfd?]

 [qui che ci metto ? una read seguita da una write su newfd?]
Ragazzi...
scusatemi se sto facendo un casino nel porre le domande e rispondermi da 
solo... non vogliatemene, vi prego :)
Quello che ho scritto sopra mi son accorto che è una mezza caxxata :)
L'ho corretto in:
fd=open(argv[1], O_RDWR | O_CREAT, 0666);
dup2(fd, STDOUT_FILENO);
execl("/bin/ls", "ls", "-l", NULL);
e funziona :)
Grazie a tutti per la pazienza :)

 [qui che ci metto ? una read seguita da una write su newfd?]
Hai provato ad invertire i parametri della dup2()?
fd = open(argv[1], O_WRONLY | O_CREAT, 0644);
/* In questo caso specifico meglio aprirlo in sola scrittura come lo 
stdout e mettere la maschera dei permessi :-) */
dup2(fd, STDOUT_FILENO);
close(fd);
execl("/bin/ls", "ls", "-l", NULL);
Le write() fatte sullo stdout dal programma ls vanno a finire nel file 
puntato da argv[1].
