Der Unterschied zwischen stdout und STDOUT_FILENO

Lesezeit: 3 Minuten

Benutzeravatar von Bing Lu
Bing Lu

Ich wunderte mich über den Unterschied zwischen stdout und STDOUT_FILENO unter Linux C.

Nach einiger Recherchearbeit ziehe ich folgendes Fazit. Können Sie mir helfen, es zu überprüfen und Fehler darin zu korrigieren? Vielen Dank

  • stdout gehört zum Standard-I/O-Stream der C-Sprache; dessen Typ FILE* ist und in stdio.h definiert ist

  • STDOUT_FILENOdie einen int-Typ besitzt, ist bei definiert unistd.h. Es ist ein Dateideskriptor des LINUX-Systems. Im unistd.hes wird wie folgt erklärt:

The following symbolic constants shall be defined for file streams:

STDERR_FILENO
    File number of stderr; 2.
STDIN_FILENO
    File number of stdin; 0.
STDOUT_FILENO
    File number of stdout; 1.

Also meiner Meinung nach die STDOUT_FILENO gehört zum Aufrufen auf Systemebene und in gewissem Maße wie eine System-API. STDOUT_FILENO kann verwendet werden, um jedes Gerät im System zu beschreiben.

Das stdout befindet sich auf einer höheren Ebene (Benutzerebene?) und kapselt tatsächlich die Details von STDOUT_FILENO. stdout hat E/A-Puffer.

Das ist mein Verständnis über ihren Unterschied. Jeder Kommentar oder Korrektur wird geschätzt, danke.

  • @KerrekSB Die Frage ist, ich bin mir nicht sicher, ob mein Verständnis richtig ist?

    – Bing Lu

    15. Oktober 2012 um 19:32 Uhr

  • STDOUT_FILENO ist nicht Linux Spezifisch. Alle POSIX (und Unix) Systeme haben es (zB auch MacOSX oder FreeBSD oder Solaris)

    – Basile Starynkevitch

    15. Oktober 2012 um 19:41 Uhr

Benutzeravatar von Basile Starynkevitch
Basile Starynkevitch

stdout ist ein FILE* “constant” gibt den Standard-Outout-Stream an. Also offensichtlich fprintf(stdout, "x=%d\n", x); hat das gleiche Verhalten wie printf("x=%d\n", x);; Sie nutzen stdout zum <stdio.h> Funktionen wie fprintf, fputs etc..

STDOUT_FILENO ist ein ganzzahliger Dateideskriptor (eigentlich die Ganzzahl 1). Sie könnten es verwenden für write Systemaufruf.

Die Beziehung zwischen den beiden ist STDOUT_FILENO == fileno(stdout)

(Außer nachdem du seltsame Dinge getan hast, wie z fclose(stdout);oder vielleicht einige freopen nach ein paar fclose(stdin), was Sie fast nie tun sollten! Siehe dies, wie von JFSebastian kommentiert)

Sie bevorzugen normalerweise die FILE* Dinge, weil sie gepuffert sind (also normalerweise gut funktionieren). Manchmal möchten Sie vielleicht anrufen fflush Puffer zu spülen.

Sie könnten Dateideskriptornummern für verwenden Systemaufrufe wie schreiben(2) (die von der verwendet wird stdio Bibliothek) bzw Umfrage(2). Aber die Verwendung von Systemaufrufen ist umständlich. Es kann Ihnen eine sehr gute Effizienz geben (aber das ist schwer zu codieren), aber sehr oft die stdio Die Bibliothek ist gut genug (und portabler).

(Natürlich solltest du #include <stdio.h> für die stdio-Funktionen und #include <unistd.h> -und einige andere Header- für die Systemaufrufe wie write. Und die stdio-Funktionen werden mit Syscalls implementiert, also fprintf darf anrufen write).

  • STDOUT_FILENO == fileno(stdout) Wunderbar, dieser Ausdruck hilft mir, dieses Problem vollständig zu verstehen. Danke vielmals. @Basil

    – Bing Lu

    15. Oktober 2012 um 19:39 Uhr


  • STDOUT_FILENO == fileno(stdout) – ist es immer wahr?

    – jfs

    26. August 2014 um 22:49 Uhr

  • Dateideskriptoren sind auch nützlich, um Streams an verschiedene Stellen in der Dateideskriptortabelle umzuleiten dup2 (z. B. die Ausgabe eines untergeordneten Prozesses nehmen, der einen Systemaufruf ausführt und an druckt stdout und dem Betriebssystem mitteilen, diese Ausgabe in eine Textdatei umzuleiten, bevor der Systemaufruf erfolgt)

    – Jake Levi

    24. November 2019 um 17:56 Uhr


  • Ich bin verwirrt mit STDOUT_FILENO == fileno(stdout) wenn nicht du machst etwas komisches, so wie hier, für mich hört es sich so an STDOUT_FILENO != fileno(stdout) ist möglich, wäre es nicht besser zu verwenden fileno(stdout) im API? Wann müssen Sie tatsächlich verwenden STDOUT_FILENO außer beim Vergleich mit fileno(stdout)?

    – Rich Jahn

    7. Dezember 2021 um 21:49 Uhr

1417710cookie-checkDer Unterschied zwischen stdout und STDOUT_FILENO

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

Privacy policy