75

stdout我想知道 Linux C和STDOUT_FILENOLinux C之间的区别。

经过一番搜索工作,我得出以下结论。你能帮我复习一下并纠正其中的任何错误吗?谢谢

  • stdout属于C语言的标准I/O流;其类型为 FILE* 并在 stdio.h 中定义

  • STDOUT_FILENO,具有 int 类型,定义在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 缓冲区。

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

4

1 回答 1

98

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);,或者可能一些freopen之后fclose(stdin),你几乎不应该这样做!见这个,正如JFSebastian评论的那样)

您通常更喜欢这些FILE*东西,因为它们是缓冲的(因此通常表现良好)。有时,您可能想调用fflush刷新缓冲区。

您可以将文件描述符编号用于系统调用,例如write(2)(由stdio库使用)或poll(2)。但是使用系统调用是笨拙的。它可能会为您提供非常好的效率(但这很难编码),但通常该stdio库已经足够好(并且更便携)。

(当然,您应该#include <stdio.h>使用 stdio 函数,以及#include <unistd.h>- 以及其他一些头文件 - 用于系统调用,例如write。并且 stdio 函数是使用系统调用实现的,因此fprintf可以调用write)。

于 2012-10-15T19:32:29.623 回答