我想知道Linux C中stdout
和STDOUT_FILENO
之间的区别。
经过一番搜索,我得出以下结论。你能帮我复习一下并改正其中的错误吗?谢谢
stdout
属于C语言的标准I/O流;其类型为FILE* 并在stdio. h中定义STDOUT_FILENO
是在unistd.h
定义的,是int类型,是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缓冲区。
这是我对他们的不同之处的理解。任何评论或更正都是非常感谢的。
1条答案
按热度按时间kpbwa7wx1#
stdout
是FILE*
指针,给出标准输出流,所以fprintf(stdout, "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
,这是你几乎不应该做的!参见this,正如J.F.Sebastian所评论的那样)您通常更喜欢
FILE*
,因为它们是缓冲的(因此通常性能良好),有时候,您可能希望调用fflush()
来刷新缓冲区。你可以使用syscalls的文件描述符号,比如
write()
(stdio
库使用的),或者poll()
,但是使用系统调用是笨拙的,它可能会给你带来很好的效率(但是很难编码),但是通常stdio
库已经足够好了(而且更容易移植)。(Of当然,对于stdio函数应该使用
#include <stdio.h>
,对于write
这样的系统调用,应该使用#include <unistd.h>
-以及其他一些头文件。stdio函数是用系统调用实现的,因此fprintf()
可以调用write()
)。