LINUX C中stdout和STDOUT_FILENO之间的区别

Bing Lu :

我想知道Linux C stdoutSTDOUT_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_FILENOstdout具有I / O缓冲区。

这就是我对它们的区别的了解。谢谢任何评论或纠正。

Basile Starynkevitch:

stdoutFILE*提供标准输出流“常量”。因此显然fprintf(stdout, "x=%d\n", x);具有与相同的行为printf("x=%d\n", x);; 您使用stdout<stdio.h>类似功能fprintffputs等等。

STDOUT_FILENO是整数文件描述符(实际上是整数1)。您可以将其用于writesyscall。

两者之间的关系是 STDOUT_FILENO == fileno(stdout)

(除非你喜欢做奇怪的事情后fclose(stdout);,或许有些freopen过了一段fclose(stdin),你应该几乎不这么做!看这个,正如评论JFSebastian

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

您可以为syscall使用文件描述符号,例如write(2)(由stdio库使用)或poll(2)但是使用系统调用很麻烦。它可能会给您带来很好的效率(但是很难编写代码),但是很多时候stdio库足够好(并且更加可移植)。

(当然,您应该#include <stdio.h>为stdio函数提供服务,并且#include <unistd.h>-和其他一些标头-为syscall write所支持。stdio函数是通过syscalls实现的,因此fprintf可以调用write)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章