LINUX C中stdout和STDOUT_FILENO的区别
我想知道在Linux中stdout和STDOUT_FILENO之间的区别 
经过一番search工作,我得出以下结论。 你能帮我检查一下,纠正它的错误吗? 谢谢
- 
stdout属于C语言的标准I / Ostream; 其types是FILE *并在stdio.h中定义
- 
拥有inttypes的 STDOUT_FILENO在unistd.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>函数,如fprintf , fputs等。 
  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 )。