Ik vroeg me af wat het verschil is tussen stdout
en STDOUT_FILENO
in Linux C.
Na wat zoekwerk trek ik de volgende conclusie. Kun je me helpen het te bekijken en eventuele fouten erin te corrigeren? Bedankt
-
stdout
behoort 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 opunistd.h
. Het is een bestandsdescriptor van het LINUX-systeem. Inunistd.h
wordt 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_FILENO
bij aanroepen op systeemniveau en, tot op zekere hoogte, als een systeem-API. STDOUT_FILENO
kan worden gebruikt om elk apparaat in het systeem te beschrijven.
De stdout
bevindt zich op een hoger niveau (gebruikersniveau?) en omvat feitelijk de details van STDOUT_FILENO
. stdout
heeft I/O-buffer.
Dat begrijp ik over hun verschil. Elke opmerking of correctie wordt op prijs gesteld, bedankt.
Antwoord 1, autoriteit 100%
stdout
is 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 stdout
voor <stdio.h>
functies zoals fprintf
, fputs
etc..
STDOUT_FILENO
is een integer bestandsdescriptor (eigenlijk het integer 1). Je zou het kunnen gebruiken voor write
syscall.
De relatie tussen de twee is STDOUT_FILENO == fileno(stdout)
(Behalve nadat je rare dingen hebt gedaan zoals fclose(stdout);
, of misschien wat freopen
na 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 fflush
aanroepen om buffers te spoelen.
U kunt bestandsdescriptornummers gebruiken voor syscallszoals write(2)(die wordt gebruikt door de stdio
bibliotheek), 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 fprintf
kan write
aanroepen).