stdout 和 STDOUT_FILENO 有什么区别?
- 2024-11-06 08:34:00
- admin 原创
- 50
问题描述:
我想知道Linux/C 中stdout
和之间的区别STDOUT_FILENO
,经过一番研究,我得出以下理解:
stdout
属于C语言的标准I/O流,其类型为FILE*
,定义在 中stdio.h
。STDOUT_FILENO
是int
中定义的一个值unistd.h
,是LINUX系统的一个文件描述符,在 中unistd.h
对它的解释如下:
应为文件流定义以下符号常量:
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:
stdout
是FILE*
给出标准输出流的指针。因此显然`fprintf(stdout, "x=%d
", x);具有与 相同的行为
printf("x=%d
", x);;用于
stdout诸如
<stdio.h>等
fprintf()函数
fputs()`。
STDOUT_FILENO
是一个整数文件描述符(实际上是整数 1)。您可以将其用于write
系统调用。
两者之间的关系是STDOUT_FILENO == fileno(stdout)
(除非您做了一些奇怪的事情,例如fclose(stdout);
,或者可能做freopen
了一些之后的一些事情fclose(stdin)
,您几乎永远不应该这样做!请参阅此内容,如JFSebastian所评论的)
您通常更喜欢这些FILE*
东西,因为它们是缓冲的(因此通常表现良好)。有时,您可能想要调用fflush()
来刷新缓冲区。
您可以使用文件描述符编号进行系统调用,例如write()
(由库使用stdio
)或poll()
。但使用系统调用很笨拙。它可能会为您提供非常好的效率(但这很难编码),但很多时候stdio
库已经足够好了(并且更易于移植)。
(当然,您应该#include <stdio.h>
为 stdio 函数和#include <unistd.h>
- 以及一些其他标头 - 用于系统调用,如write
。并且 stdio 函数是用系统调用实现的,因此fprintf()
可以调用write()
)。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件