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