LINUX C中stdout和STDOUT_FILENO的区别

我想知道在Linux中stdoutSTDOUT_FILENO之间的区别

经过一番search工作,我得出以下结论。 你能帮我检查一下,纠正它的错误吗? 谢谢

  • stdout属于C语言的标准I / Ostream; 其types是FILE *并在stdio.h中定义

  • 拥有inttypes的STDOUT_FILENOunistd.h定义。 这是LINUX系统的文件描述符。 在unistd.h ,解释如下:

 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. 

所以,在我看来, STDOUT_FILENO属于系统级调用,在某种程度上就像系统API。 STDOUT_FILENO可以用来描述系统中的任何设备。

stdout位于更高级别(用户级别?),并实际封装了STDOUT_FILENO的详细信息。 stdout具有I / O缓冲区。

这是我了解他们的差异。 任何意见或更正表示赞赏,谢谢。

stdout是一个FILE* “常量”给出标准输出stream。 所以显然fprintf(stdout, "x=%d\n", x);printf("x=%d\n", x);具有相同的行为printf("x=%d\n", x); ; 你使用stdout来执行<stdio.h>函数,如fprintffputs等。

STDOUT_FILENO是一个整数文件描述符(实际上是整数1)。 你可以用它来write系统调用。

两者之间的关系是STDOUT_FILENO == fileno(stdout)

(除了你做奇怪的事情,如fclose(stdout); ,或者一些fclose(stdin)之后,也许有些freopen ,你应该几乎从不这样做!看到这一点 ,由JFSebastian评论)

你通常更喜欢FILE*东西,因为它们被缓冲(所以通常performance不错)。 有时,您可能需要调用fflush来刷新缓冲区。

您可以使用文件描述符编号,如write(2) (由stdio库使用)或poll(2) 。 但是使用系统调用是很麻烦的。 它可能会给你非常好的效率(但是很难编码),但是stdio库很好(而且更便携)。

(当然,你应该为stdio函数#include <stdio.h> ,以及#include <unistd.h>和其他一些头文件,用于系统调用,比如write ,而stdio函数是用syscalls来实现的,所以fprintf可以调用write )。