PDA

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?

VICIUS
01-07-2008, 16:31
> 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);
?

VICIUS
01-07-2008, 16:43
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