- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我想知道 Linux C 中 stdout
和 STDOUT_FILENO
之间的区别。
经过一番搜索,我得出以下结论。你能帮我复习一下并纠正其中的任何错误吗?谢谢
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
系统调用。
两者的关系是STDOUT_FILENO == fileno(stdout)
(除非你做了一些奇怪的事情,比如 fclose(stdout);
,或者在一些 freopen
之后做了一些 fclose(stdin)
,你几乎不应该这样做!见 this ,由 J.F.Sebastian 评论)
您通常更喜欢 FILE*
的东西,因为它们是缓冲的(因此通常表现良好)。有时,您可能需要调用 fflush
来刷新缓冲区。
您可以使用 syscalls 的文件描述符编号,例如 write(2)(由 stdio
库使用)或 poll(2)。但是使用系统调用是笨拙的。它可能会为您提供非常好的效率(但这很难编码),但通常 stdio
库已经足够好(并且更便携)。
(当然,对于 stdio 函数,您应该使用 #include <stdio.h>
,而对于 #include <unistd.h>
等系统调用,您应该使用 write
- 和其他一些头文件。并且 stdio 函数是通过系统调用实现的,因此 fprintf
可能会调用 write
)。
关于c - stdout 和 STDOUT_FILENO 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12902627/
我对使用“>/home/hel/myfile”执行文件感到困惑。如果 fd 是“/home/hel/myfile”的文件处理程序,这完全等同于 dup2(fd, STDOUT_FILENO) 吗?至于
我有一个奇怪的问题。我的C语言不是很好。我正在尝试创建一个守护进程来在 Linux 中执行基于 bash 脚本的服务。为了方便起见,我简化了代码。下面是我的代码。 #include #include
我想知道为什么取消注释以下程序中的第一个 printf 语句会改变其后续行为: #include #include #include #include int main() { //pri
我正在尝试实现 GNU popen 库,但遇到 dup2 问题。我想将子管道复制到 STDOUT_FILENO 和 STDERR_FILENO。 我在这里对 dup2 有点困惑,因为它在手册页上说 d
我想知道 Linux C 中 stdout 和 STDOUT_FILENO 之间的区别。 经过一番搜索,我得出以下结论。你能帮我复习一下并纠正其中的任何错误吗?谢谢 stdout属于C语言的标准I/O
fd = open("/dev/null", O_RDWR); if (fd == -1) { ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
这个问题在这里已经有了答案: Difference between fclose and close (4 个答案) 关闭 6 年前。 我想将 STDOUT 重定向到磁盘上的文件。重点是让我程序上的
我有多个进程通过主程序的 fork 产生,这意味着它们输出到相同的标准输出(我想要的)。但是我需要以某种方式防止输出交错。我已经使用 fcntl 锁来同步对日志文件的访问,所以我也想将它用于 stdo
我有以下代码: void set_fl(int fd, int flags) /* flags are file status flags to turn on */ { int val;
我知道这里有很多关于 C 中写入、读取系统调用和文件描述符的问题。我试着搜索了一下,但我真的找不到我要找的东西,所以... 从 STDIN_FILENO 读取时在新行上出现 EOF? 假设我在 tes
我有一项作业正在处理,但我很难完成它。这个想法是编写一个程序 if.c 来执行一个程序,如果成功则执行第二个程序。我应该抑制第一个程序的标准输出并取消抑制第二个程序的标准输出。我在多项测试中收到错误消
我是一名优秀的程序员,十分优秀!