View Full Version : [C unix] exec
stella_650
01-07-2008, 15:59
Ciao a tutti,
potrei sapere come fare per implementare con una funzione della famiglia exec questo comando di shell?
sort -g > temp.txt
dal momento che
execlp("sort","sort","-g",">","temp.txt",0);
mi da errore?
> temp.txt ridirige stdout sul file e a questo ci pensa la shell non il comando sort. Per simulare questa cosa puoi prima aprire con fopen il file temp.txt e poi sostituirlo a stdout usando dup2, poi lanci la execlp.
stella_650
01-07-2008, 16:37
> temp.txt ridirige stdout sul file e a questo ci pensa la shell non il comando sort. Per simulare questa cosa puoi prima aprire con fopen il file temp.txt e poi sostituirlo a stdout usando dup2, poi lanci la execlp.
dovrei quindi prima fare la open del file temp.txt
---sostituirlo a stdout usando dup2---nn ho capito come
eseguire la execlp("sort","sort","-g",0);
?
Esatto.
Supponendo che temp_file sia il puntatore allo stream per temp.txt puoi usare dup2 in questo modo.
dup2(fileno(temp_file), fileno(stdout));
In questo modo stdout viene chiuso e sostituito con temp_file.
DanieleC88
01-07-2008, 17:59
Ricorda che va fatto nel figlio che viene forkato e che andrà ad eseguire la exec*(). ;)
stella_650
01-07-2008, 18:01
Esatto.
Supponendo che temp_file sia il puntatore allo stream per temp.txt puoi usare dup2 in questo modo.
dup2(fileno(temp_file), fileno(stdout));
In questo modo stdout viene chiuso e sostituito con temp_file.
Concettualmente ora è chiaro ma non capisco perchè la dup2 in quel modo mi restituisce questo warning che non mi consente di andare avanti...
In function ‘main’:
es1_1710.c:63: warning: passing argument 1 of ‘fileno’ makes pointer from integer without a cast
DanieleC88
01-07-2008, 18:13
Perché stai usando un intero come descrittore ottenuto dalla open() e non un descrittore ottenuto dalla fopen(): una delle due fileno() è superflua. ;)
stella_650
01-07-2008, 18:23
quindi volendo usare open lo posso fare cmq?
io faccio...
int temp_file;
if(pid3==0)//è uno dei figli nel programma
{
temp_file=fopen("temp.txt",O_RDWR, O_CREAT | O_TRUNC,0766);
dup2(fileno(temp_file),fileno(stdout)); //non è corretto perchè non uso fopen
execlp("sort","sort","-g",(char*)0);
perror("sort");
}
DanieleC88
01-07-2008, 18:29
Certo che puoi farlo, ma non come mi hai scritto ora: chiami fopen() con i parametri della open() e assegnando il valore ad un int... :D
Per il resto sì, basta che non usi fileno() su temp_file. ;)
stella_650
01-07-2008, 18:36
Certo che puoi farlo, ma non come mi hai scritto ora: chiami fopen() con i parametri della open() e assegnando il valore ad un int... :D
Per il resto sì, basta che non usi fileno() su temp_file. ;)
int temp_file;
if(pid3==0)//è uno dei figli nel programma
{
temp_file=open("temp.txt",O_RDWR, O_CREAT | O_TRUNC,0766);
dup2(temp_file,fileno(stdout));
execlp("sort","sort","-g",(char*)0);
perror("sort");
giusto?
DanieleC88
01-07-2008, 18:42
Sì, dovrebbe andare bene così. Ma perché (char*)0 e non NULL? :D
stella_650
01-07-2008, 18:50
Ma perché (char*)0 e non NULL? :D
è equivalente ...
Sì, dovrebbe andare bene così.
funziona infatti:)
DanieleC88
01-07-2008, 18:52
è equivalente ...
Appunto... :stordita: :D
stella_650
01-07-2008, 18:58
Appunto... :stordita: :D
hehe...mi hanno abituata così bho:D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.