关于重定向的小补充

在管道那里提到了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做一下区分

为什么会显示不正确结果

相关推荐
T1mzhou1 小时前
ARM64 平台安全学习记录
linux·服务器·arm开发·arm
GG-_-Bond2 小时前
基于dpdk实现udp接收数据
linux·网络·udp
吴声子夜歌2 小时前
Shell编程实例——bash入门
linux·运维·shell
爱和冰阔落2 小时前
【Linux】条件变量为什么必须配合互斥锁:从 pthread_cond_wait 到阻塞队列
linux·运维·c++·缓存·中间件·安卓
tedcloud1232 小时前
God‘s Eye View 怎么搭建?在云服务器上部署一个实时 3D 地球可视化平台
linux·服务器·开发语言·后端·rust
星间都市山脉2 小时前
Android16 SystemService.onBootPhase 调用时机
android·java·linux·windows·ubuntu
初願致夕霞2 小时前
Linux 进程间通信(IPC)机制详解:管道、FIFO 与 System V 共享内存
linux·服务器·c++
ynchyong2 小时前
Linux nohup 后台服务合并标准错误输出到一个文件
java·linux·运维
xx~t3 小时前
嵌入式——51单片机3
linux·c语言·嵌入式硬件·51单片机