C语言 标准输出和STDOUT_FILENO之间的差异

v9tzhpje  于 2023-03-07  发布在  其他
关注(0)|答案(1)|浏览(209)

我想知道Linux C中stdoutSTDOUT_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缓冲区。
这是我对他们的不同之处的理解。任何评论或更正都是非常感谢的。

kpbwa7wx

kpbwa7wx1#

stdoutFILE*指针,给出标准输出流,所以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())。

相关问题