Wie kann ich stdout vorübergehend in eine Datei in einem C-Programm umleiten?

Lesezeit: 2 Minuten

Benutzer-Avatar
Frank

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?

Benutzer-Avatar
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 ohne dup2 hat gefährliche Rennbedingungen. Der Punkt von dup2(x,y) ist zu ersetzen y atomar mit Kopie von x.

    – 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 das open Linie zu newFd = open(filename, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR );

    – Mark Lakata

    3. Juni 2020 um 1:52 Uhr


1368840cookie-checkWie kann ich stdout vorübergehend in eine Datei in einem C-Programm umleiten?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy