In meinem C-Programm möchte ich stdout vorübergehend auf umleiten /dev/null
(zum Beispiel). Dann, nach dem Schreiben an /dev/null
, ich möchte stdout wiederherstellen. Wie gehe ich damit um?
Wie kann ich stdout vorübergehend in eine Datei in einem C-Programm umleiten?
Frank
R.. GitHub HÖREN SIE AUF, ICE ZU HELFEN
Auf POSIX-Systemen können Sie dies wie folgt tun:
int bak, new;
fflush(stdout);
bak = dup(1);
new = open("/dev/null", O_WRONLY);
dup2(new, 1);
close(new);
/* your code here ... */
fflush(stdout);
dup2(bak, 1);
close(bak);
Was Sie wollen, ist in der weiteren Allgemeinheit nicht möglich.
Jede Lösung mit freopen
ist falsch, da es Ihnen nicht erlaubt, das Original wiederherzustellen stdout
. Jede Lösung durch Zuweisung an stdout
ist falsch, wie stdout
ist kein lvalue (es ist ein Makro, das zu einem Ausdruck des Typs erweitert wird FILE *
).
-
Verwenden Sie nicht dup2. Verwenden Sie close(new) und dann dup(1); dup() stellt sicher, dass Sie den richtigen Deskriptor erhalten.
If newfd was open, any errors that would have been reported at close() time, are lost. A careful programmer will not use dup2 without closing newfd first.
– Lilian A. Moraru
11. März 2012 um 21:30 Uhr
-
@MoraruLilian: Ich habe verwendet
dup2
sehr absichtlich. Ihr Kommentar hat die Argumente alle mit meinem Code verwechselt, daher kann ich nicht sicher sein, was Ihr Punkt ist, aber jede Lösung ohnedup2
hat gefährliche Rennbedingungen. Der Punkt vondup2(x,y)
ist zu ersetzeny
atomar mit Kopie vonx
.– R.. GitHub HÖR AUF, EIS ZU HELFEN
12. März 2012 um 3:04 Uhr
-
Wenn Sie auf der Suche nach einer Möglichkeit sind, in eine neue Datei zu schreiben, und Sie wie ich sind und sich nicht alle Argumente zu merken haben
open
ändere dasopen
Linie zunewFd = open(filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );
– Mark Lakata
3. Juni 2020 um 1:52 Uhr