关于重定向的小补充

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

为什么会显示不正确结果

相关推荐
DYWorker0015 小时前
Linux驱动:RK3568 GMAC + YT8531C 千兆以太网全流程解剖
linux
lisanmengmeng6 小时前
NRPE 添加命令(一)
linux·运维·服务器
树下水月7 小时前
Typora破解
linux·服务器·前端
沫璃染墨8 小时前
《从零入门Linux系统篇(五十七):线程篇·十——生产者消费者模型进阶:从环形缓冲区到POSIX信号量》
linux·运维·服务器·开发语言·c++·系统架构·信号处理
wuminyu8 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
深念Y8 小时前
rime-雾凇拼音-配置记录
linux·junit·软件·拼音·kde
殷色玫瑰9 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
忆挽篱笙歌10 小时前
gcc,g++
linux
l1t11 小时前
修复WSL CreateInstance/E_UNEXPECTED和 mounted read-only 错误
linux·windows·wsl
Ruiery11 小时前
Linux 6.6内核 CPU 深度解析(九):时钟与 TSC — 内核怎么从 PIT/HPET 切到 TSC
linux·运维·服务器