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. Dans unistd.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.

43
demandé sur jww 2012-10-15 23:26:46

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 ).

60
répondu Basile Starynkevitch 2017-05-23 11:46:24