|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
[C unix] exec
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 Codice:
execlp("sort","sort","-g",">","temp.txt",0); |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
> 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.
|
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
---sostituirlo a stdout usando dup2---nn ho capito come eseguire la execlp("sort","sort","-g",0); ? |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Oct 2001
Messaggi: 11471
|
Esatto.
Supponendo che temp_file sia il puntatore allo stream per temp.txt puoi usare dup2 in questo modo. Codice:
dup2(fileno(temp_file), fileno(stdout)); |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ricorda che va fatto nel figlio che viene forkato e che andrà ad eseguire la exec*().
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#6 | |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
In function ‘main’: es1_1710.c:63: warning: passing argument 1 of ‘fileno’ makes pointer from integer without a cast |
|
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Perché stai usando un intero come descrittore ottenuto dalla open() e non un descrittore ottenuto dalla fopen(): una delle due fileno() è superflua.
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
quindi volendo usare open lo posso fare cmq?
io faccio... Codice:
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"); |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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...
![]() Per il resto sì, basta che non usi fileno() su temp_file. ![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#10 | |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
Codice:
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"); Ultima modifica di stella_650 : 01-07-2008 alle 17:39. |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Sì, dovrebbe andare bene così. Ma perché (char*)0 e non NULL?
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#12 |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
|
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#14 |
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
|
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:27.