📃个人主页:island1314
🔥个人专栏:Linux—登神长阶
⛺️ 欢迎关注:👍点赞 👂🏽留言 😍收藏 💞 💞 💞
引言
**其实之前我们在这篇博客里面,已经提过了 重定向的 一些知识,这里是对 其做出的 一些补充学习,大家可以先看看之前的博客内容,再来学习这个 **
【Linux】基础 IO(文件描述符fd & 缓冲区 & 重定向
**1. cerr **
🚀 在 Linux 中,cerr** ** 是 C++ 标准库中的一个输出流,用于输出错误消息。它是 isotream** ** 头文件的一部分,具体定义在 std** ** 命名空间下。以下是对 cerr** ** 的详细说明:
1.1 基本概念
- 无缓冲输出:cerr** ** 是一个无缓冲的输出流。这意味着当你向 cerr** ** 输出数据时,数据会立即写入目标,而不会被缓冲。这对于错误信息的即时输出非常重要,因为你希望在发生错误时能够立即看到相关信息。
- 标准错误流:cerr** **默认情况下连接到标准错误(stderr),这是一个用于输出错误信息的特殊输出流。在 Linux 中,标准错误和标准输出是两个不同的流,通常它们都连接到终端,但可以独立重定向。
1.2 使用 cerr** **
使用 cerr** ** 输出错误信息的基本语法如下:
#include <iostream>
using namespace std;
int main()
{
cerr << "Hello cerr" << endl;
return 0;
}
运行如下:(错误信息 将立即输出到标准错误流。)
1.3 特性与行为
- 线程安全:在多线程程序中,cerr** ** 是线程安全的。这意味着多个线程可以安全地同时写入 cerr** **,不会产生数据混乱。
- 与 cout 区别:与 cout(标准输出流)相比,cerr** ** 不会进行缓冲,因此更适合用于错误信息的输出。cerr** ** 会对输出进行缓冲,可能导致信息的延迟显示。
1.4 cout 与 cerr 对比 🎐
#include <iostream>
using namespace std;
int main()
{
cout << "Hello cout" << endl;
cerr << "Hello cerr" << endl;
return 0;
}
造成上述结果的原因主要与标准输出和标准错误流的特性以及重定向机制有关。具体来说,以下几点解释了为什么 cout 和 cerr 的输出表现不同:🔍
a. 输出流的区别
- 标准输出(stdout):cout 是 C++ 的标准输出流,默认情况下,它连接到终端。它是缓冲的,意味着输出内容会先存储在内存中,直到缓冲区满或遇到换行符(如
endl
),才会一次性写入终端。 - 标准错误(stderr):cerr 是 C++ 的标准错误流,默认连接到终端。与 cout 不同,cerr 是无缓冲的,这意味着每次写入 cerr 时,内容会立即显示,无论缓冲区是否满。
b. 重定向的工作机制
- 当你使用重定向符号
>
时,系统会将标准输出(stdout)重定向到指定的文件 - 标准错误(stderr)流的重定向不会自动发生,除非明确指定。这意味着,尽管 cout 的输出被写入到
log.txt
,cerr 仍然会直接输出到终端。
c. 输出顺序
- 在程序执行中,cout 的输出是先存储在缓冲区中,可能会在程序结束或调用
flush
时才写入文件,而 cerr 的输出立即显示。因此,终端上的错误信息会在文件内容输出后立刻可见。
这种机制确保了:
- 正常的程序输出(cout )可以被重定向到文件,便于记录和查看。
- 错误信息(cerr)能够迅速反馈给用户,不会因为输出重定向而延迟显示。这对于调试和错误处理非常重要。
如下:
2. 2>&1
./code > log.txt 2>&1
- **
2>&1
**:这是一个重要的部分,用于将标准错误(文件描述符2
)重定向到标准输出(文件描述符1
)。这意味着错误信息会被写入到log.txt
中,而不是显示在终端 - 这个重定向方法常用于日志记录,确保无论程序输出是正常还是错误信息,都可以被记录到同一个文件中,便于后续查看和分析
3. 练习
bash中,需要将脚本 demo.sh 的标准输出和标准错误输出重定向至文件demo.log,以下哪些用法是正确的 [多选]
正确答案: A B C D
A. bash demo.sh &>demo.log
B. bash demo.sh >&demo.log
C. bash demo.sh >demo.log 2>&1
D. bash demo.sh 2>demo.log 1>demo.log
分析:
在命令的重定向中, >表示重定向,0 表示标准输入,1 表示标准输出,2 表示标准错误
如果需要将标准输出和标准错误输出重定向至文件demo.log;
比较典型的方式是:bash demo.sh 1>demo.log 2>&1
- 先将标准输出重定向到demo.log文件,然后将标准错误重定向到标准输出(这时候的标准输出已经是指向文件了,所以也就是将标准错误重定向到文件)
A、command &> file 表示将标准输出stdout和标准错误输出stderr重定向至指定的文件file中。
B、与A的选项功能雷同
C、一个十分典型的写法,将标准输出和标准错误都重定向到文件, >demo.log是一种把前面的标准输出 1 忽略掉的写法
D、比较直观的一种写法,给我们直观的将标准输入和标准错误分别重定向到文件
4. 小结 📖
【★,°*:.☆( ̄▽ ̄)/$:*.°★ 】那么本篇到此就结束啦,如果我的这篇博客可以给你提供有益的参考和启示,可以三连支持一下 !!**
版权归原作者 IsLand1314~ 所有, 如有侵权,请联系我们删除。