Het verschil tussen stdout en STDOUT_FILENO

Ik vroeg me af wat het verschil is tussen stdouten STDOUT_FILENOin Linux C.

Na wat zoekwerk trek ik de volgende conclusie. Kun je me helpen het te bekijken en eventuele fouten erin te corrigeren? Bedankt

  • stdoutbehoort tot de standaard I/O-stroom van C-taal; waarvan het type FILE* is en gedefinieerd in stdio.h

  • STDOUT_FILENO, met een int-type, wordt gedefinieerd op unistd.h. Het is een bestandsdescriptor van het LINUX-systeem. In unistd.hwordt het als volgt uitgelegd:

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.

Dus, naar mijn mening, hoort de STDOUT_FILENObij aanroepen op systeemniveau en, tot op zekere hoogte, als een systeem-API. STDOUT_FILENOkan worden gebruikt om elk apparaat in het systeem te beschrijven.

De stdoutbevindt zich op een hoger niveau (gebruikersniveau?) en omvat feitelijk de details van STDOUT_FILENO. stdoutheeft I/O-buffer.

Dat begrijp ik over hun verschil. Elke opmerking of correctie wordt op prijs gesteld, bedankt.


Antwoord 1, autoriteit 100%

stdoutis een FILE*“constante” die de standaard outout-stroom geeft. Het is dus duidelijk dat fprintf(stdout, "x=%d\n", x);hetzelfde gedrag vertoont als printf("x=%d\n", x);; je gebruikt stdoutvoor <stdio.h>functies zoals fprintf, fputsetc..

STDOUT_FILENOis een integer bestandsdescriptor (eigenlijk het integer 1). Je zou het kunnen gebruiken voor writesyscall.

De relatie tussen de twee is STDOUT_FILENO == fileno(stdout)

(Behalve nadat je rare dingen hebt gedaan zoals fclose(stdout);, of misschien wat freopenna wat fclose(stdin), wat je bijna nooit zou moeten doen! Zie dit, zoals opgemerkt door JFSebastian)

Je geeft meestal de voorkeur aan de FILE*dingen, omdat ze gebufferd zijn (dus meestal goed presteren). Soms wil je misschien fflushaanroepen om buffers te spoelen.

U kunt bestandsdescriptornummers gebruiken voor syscallszoals write(2)(die wordt gebruikt door de stdiobibliotheek), of poll(2). Maar het gebruik van syscalls is onhandig. Het kan je een zeer goede efficiëntie geven (maar dat is moeilijk te coderen), maar heel vaak is de stdio-bibliotheek goed genoeg (en draagbaarder).

(Natuurlijk moet je #include <stdio.h>voor de stdio-functies, en #include <unistd.h>-en enkele andere headers- voor de syscalls zoals write. En de stdio-functies zijn geïmplementeerd met syscalls, dus fprintfkan writeaanroepen).

Other episodes