标准文件描述符与标准文件句柄
本文并非阐述文件描述符与文件句柄的异同,而是标准
这是怎样的标准呢?#
fork
创建一个进程,规定默认存在3个文件描述符,分别是
描述符编号 | 简介 | 作用 |
---|---|---|
0 | 标准输入 | 通用于获取输入的文件描述符 |
1 | 标准输出 | 通用输出普通信息的文件描述符 |
2 | 标准错误 | 通用输出错误信息的文件描述符 |
标准输入比较好理解,在函数scanf
中,就是从标准输入获取的数据。我们执行一个命令,只要此命令在前台执行,标准输入就是我们在终端的输入。
标准输出与标准错误用途是有差别的。从命名上我们就发现,标准错误用于输出错误信息,而标准输出更多只是输出提示信息。通过不同的文件描述符,把普通的提示信息和错误提示信息区分开,非常方便于过滤日志。
在默认情况下,标准输出和标准错误都指向同一个文件,如果在终端前台执行,那么不管是标准输出还是标准错误,都是输出到终端。
C语言对标准的运用#
C中与这标准相关的宏有六个,
标准 | stdio.h | unistd.h |
---|---|---|
标准输入 | stdin | STDIN_FILENO |
标准输出 | stdout | STDOUT_FILENO |
标准错误 | stderr | STDERR_FILENO |
stdin
和 STDIN_FILENO
都指向的是标准输入,前者是 FILE
类型,就是我们所说文件句柄,而后者是int
类型,就是我们所说的文件描述符。标准输出和标准错误也是一样的情况。
所以,在不同的C接口,我们需要用不同的宏。
fprintf(stdout, "stdout\n");
write(STDOUT_FILENO, "STDOUT_FILENO\n", 14);
前面有提到,标准输入、标准输出、标准错误是默认存在的,也就是说我们不需要open
或者fopen
,可以直接使用。例如
#include <stdio>
int main(int argc, char **argv)
{
fprintf(stderr, "something error\n");
}
Shell对标准的运用#
Shell命令经常用到的 重定向 实际上就是对标准的运用
标准 | 运用 | 示例 |
---|---|---|
标准输入 | < | cat < helloworld.c |
标准输出 | > 或者 1> | echo "helloworld" > stdout.log |
标准错误 | 2> | grep "error" 2>/dev/null |
C&Shell配合#
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char **argv)
{
char input[100];
FILE *file;
fprintf(stdout, "stdout\n");
fprintf(stderr, "stderr\n");
write(STDOUT_FILENO, "STDOUT_FILENO\n", strlen("STDOUT_FILENO\n"));
write(STDERR_FILENO, "STDERR_FILENO\n", strlen("STDERR_FILENO\n"));
}
在Bash shell中直接执行,默认情况下,标准输出和标准错误都输出到终端
[GMPY@14:43 tmp]$./stdio
stdout
stderr
STDOUT_FILENO
STDERR_FILENO
通过Shell重定向的方法,区分开标准输出和标准错误的日志
[GMPY@14:43 tmp]$./stdio 2>stderr.log 1>stdout.log
[GMPY@14:47 tmp]$cat stderr.log
stderr
STDERR_FILENO
[GMPY@14:47 tmp]$cat stdout.log
STDOUT_FILENO
stdout
[GMPY@14:47 tmp]$
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?