2017-02-10 9 views
0

Also versuche ich die Standardausgabe mit dup() in eine Datei umzuleiten.Auswahl der Ausgabedatei mit dup()

int save_fd; 
save_fd=dup(1); //saves the current stdout 
close(1); //closes stdout 
dup2(file.txt, 1);//redirect output to file.txt 

//output goes to file.txt 

dup2(save_fd, 1); restore stdout 
close(1); 

Ich weiß, dass ich eine Datei mit fopen öffnen kann. Da dup2 int verwendet, wie gebe ich den Dateideskriptor für file.txt an?

+0

'fopen()' kehrt 'FILE *' pointer aber 'open()' gibt 'int' zurück. –

Antwort

2

Verwenden Sie open, die eine fd anstelle von fopen zurückgibt.

1

Nun, haben Sie zwei Möglichkeiten, einen Dateideskriptor zu erhalten:

  1. open()

  2. fopen() und rufen dann fileno() am geöffneten Strom

So im Fall von open() der Rückgabewert im Erfolgsfall ist der Dateideskriptor, den Sie suchen:

int fd = open("some_path", ...); 

während im Fall, dass Sie fopen() verwenden möchten, können Sie immer noch den Dateideskriptor mit dem offenen Stream zugeordnet abrufen, aber Sie müssen die Funktion fileno() nennen:

FILE *stream = fopen(some_file, "w"); 
int fd = fileno(stream); 
+0

Danke @fedepad. Ich habe versucht, mit öffnen, aber Fehler zu sagen, "ungültig in C99", so dass ich open() vorläufig verwenden. Ich benutzte 'FILE * out = fopen (" file.txt "," a "); fd_new = fileno (out); 'und das hat funktioniert. Aber jetzt bekomme ich mein Terminal nach dem Laufen nicht mehr zurück. Ich habe 'fclose (out)' und ich dachte 'dup2' restaurierte es? – user2217060

+0

@ user2217060 Ich gab Ihnen die allgemeinen Möglichkeiten, fd zu bekommen. Bitte schauen Sie hier http://stackoverflow.com/questions/14543443/in-c-how-do-you-redirect-stdin-stdout-stder-to-file-when-making-an-execvp- oder was ich denke, es hängt damit zusammen, was du erreichen willst. – fedepad