关于重定向的小补充

在管道那里提到了cerr,这里就要说下cerr,cerr会向显示器中打印错误信息,既然是打印,那是不是可以使用输出重定向将他输出的信息放到文件里呢?

对标准错误进行重定向

试验一下

cpp 复制代码
#include<iostream>
 
using namespace std;

int main()
{
    cerr <<"pipe error" <<endl;
    cerr <<"pipe error" <<endl;
    cerr <<"pipe error" <<endl;

    return 0;
}

我们发现输出还是在显示器上而并没有到我们想要重定向的文件中.

为什么呢?

标准错误 和标准输入,标准输出一样也是一个文件,也有对应的文件描述符(2号).我们在用>进行重定向时修改的是标准输出的1号文件描述符的指向.和2号没关系.

将代码扩展加上cout的输出

cpp 复制代码
#include<iostream>
 
using namespace std;

int main()
{
    cerr <<"pipe error" <<endl;
    cerr <<"pipe error" <<endl;
    cerr <<"pipe error" <<endl;

    cout<<"ok"<<endl;
    cout<<"ok"<<endl;
    cout<<"ok"<<endl;
    cout<<"ok"<<endl;
    cout<<"ok"<<endl;

    return 0;
}

此时在进行重定向,发现cout对应的输出消失了

查看log.txt发现里面对应着cout的输出.

其实冲定西那个写全了时./err 1> log.txt(1代表的是标准输出的文件描述符)(文件描述符后面没有空格)所以想要重定向标准错误要用./err 2> log.txt.此时就重定向成功了.

两个都要重定向

正确

要是两个都要重定向就要用 ./err 1>log.txt 2>&1

关于语句的解释(d老师倾情奉献)

为什么后重定向的数据没有把先重定向的数据覆盖?

只有打开log.txt文件时才会产生截断,后面只是更改文件操作符指向,没有再次打开文件,所以不会别截断.

这里共享同一个文件偏移量很重要.

错误典型

但是如果写为 ./err 1>log.txt 2>log.txt 就会发生覆盖,因为两次都打开了log.txt,都发生了截断.

为什么不可以用追加重定向

就此我自己又产生了既然这样那可不可以用追加重定向的疑惑?自己进行时间后得到下图结果

很明显结果错误,继续询问d老师得到如下回答

**前后两次打开log.txt会分配不同的struct_file.**struck_file中有写入是偏移量,会因为偏移量混乱导致错误.

struct_file的简单构成

要了解这里就要看下struct_file的简单构成.

这里要和inode做一下区分

为什么会显示不正确结果

相关推荐
by209993 小时前
Linux 基础指令与文件操作
linux·1024程序员节
Escalating_xu4 小时前
【Linux 网络编程】手写序列化与反序列化:从 x op y 到能校验的文本协议
linux·运维·网络
todoitbo5 小时前
在 Ubuntu ARM64 上运行 Q1 V3.0 MuJoCo 模型:加载、步进和单执行器响应
linux·运维·ubuntu·ai·机器人·仿真教程·启元
AR-26710-6 小时前
Linux Day26——传输层与三次握手
linux·运维
隔窗听雨眠7 小时前
PostgreSQL单表从Windows迁移到Linux:差异剖析、方案对比与全流程实战
linux·windows·postgresql
xinruoqianqiu7 小时前
记录Linux
linux
额额额对了7 小时前
嵌入式 Linux 实战:i.MX6ULL 上的 CAN 通信与摄像头采集
linux·运维·服务器
牛马鸡niumasi7 小时前
【Linux】进程替换
linux
灯澜忆梦8 小时前
【Linux】#10 | Linux 终端实用快捷键 + 安装应用
linux·运维·服务器
码士集团小青8 小时前
面霸篇:高频 Java 基础问题(核心卷一)
linux·服务器·数据库·redis·缓存·1024程序员节