LINUX C中stdout和STDOUT_FILENO之间的区别
我想知道Linux C stdout
和STDOUT_FILENO
Linux 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缓冲区。
这就是我对它们的区别的了解。谢谢任何评论或纠正。
回答:
stdout
是FILE*
提供标准输出流的“常量”。因此显然fprintf(stdout,"x=%d\n",x);
具有与相同的行为printf("x=%d\n", x);
;您使用stdout
的<stdio.h>
类似功能fprintf
,fputs
等等。
STDOUT_FILENO
是一个整数文件描述符(实际上是整数1)。您可以将其用于write
syscall。
两者之间的关系是 STDOUT_FILENO == fileno(stdout)
(除非你喜欢做奇怪的事情后fclose(stdout);
,或许有些freopen
过了一段fclose(stdin)
,你应该几乎不这么做!
您通常喜欢这些FILE*
东西,因为它们是经过缓冲的(因此通常表现良好)。有时,您可能需要调用fflush
刷新缓冲区。
您可以为syscall使用文件描述符号,例如write(2)(由stdio
库使用)或poll(2)。但是使用系统调用很麻烦。它可能会给您带来非常好的效率(但是很难编写代码),但是很多时候stdio
库足够好(并且更加可移植)。
(当然,您应该#include <stdio.h>
为stdio函数提供服务,并且#include <unistd.h>
-和一些其他标头-
为syscall write
所支持。stdio函数是通过syscalls实现的,因此fprintf
可以调用write
)。
以上是 LINUX C中stdout和STDOUT_FILENO之间的区别 的全部内容, 来源链接: utcz.com/qa/430156.html