La différence entre stdout et STDOUT FILENO dans LINUX C
je me demandais quelle était la différence entre stdout
et STDOUT_FILENO
sous Linux C.
après quelques recherches, je tire la conclusion suivante. Pouvez-vous m'aider à le réviser et à corriger toute erreur? Merci
-
stdout
appartient au flux standard d'e / s du langage C; dont le type est FILE* et défini dans stdio.h -
STDOUT_FILENO
, posséder un le type int, est défini àunistd.h
. C'est un descripteur de fichier du système LINUX. Dansunistd.h
, il est expliqué comme suit:
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.
donc, à mon avis, le STDOUT_FILENO
appartient à l'appel au niveau du système et, dans une certaine mesure, comme une API de système. STDOUT_FILENO
peut être utilisé pour décrire n'importe quel appareil dans le système.
le stdout
se situe à un niveau plus élevé (niveau de l'utilisateur? et effectivement encapsuler les détails de STDOUT_FILENO
. stdout
a un tampon d'e/s.
c'est ce que je comprends de leur différence. Tout commentaire ou correction est apprécié, merci.
1 réponses
stdout
est une "constante FILE*
donnant le flux de sortie standard. Donc évidemment fprintf(stdout, "x=%d\n", x);
a le même comportement que printf("x=%d\n", x);
; vous utilisez stdout
pour <stdio.h>
fonctions comme fprintf
, fputs
etc..
STDOUT_FILENO
est un descripteur de fichier entier (en fait, le nombre entier 1). Vous pouvez l'utiliser pour write
syscall.
la relation entre les deux est STDOUT_FILENO == fileno(stdout)
(sauf après avoir fait des choses bizarres comme fclose(stdout);
, ou peut-être quelque freopen
après quelque fclose(stdin)
, ce que vous ne devriez presque jamais faire! Voir ce , commentée par J. F. Sebastian )
vous préférez habituellement les choses FILE*
, parce qu'ils sont tamponnés (donc généralement bien performer). Parfois, vous pouvez appeler fflush
pour rincer les tampons.
vous pouvez utiliser des numéros de descripteur de fichier pour syscalls comme write(2) (qui est utilisé par la stdio
bibliothèque), ou poll(2) . Mais utiliser syscalls est maladroit. Cela peut vous donner une très bonne efficacité (mais c'est difficile à coder), mais très souvent la bibliothèque stdio
est assez bonne (et plus portable).
(bien sûr, vous devez #include <stdio.h>
pour les fonctions stdio, et #include <unistd.h>
- et quelques autres en - têtes-pour les appels syscall comme write
. Et les fonctions stdio sont implémentées avec syscalls, donc fprintf
peut appeler write
).