关于重定向的小补充

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

为什么会显示不正确结果

相关推荐
测试界的小码农1 小时前
【Linux 命令实战(06):Linux 文件权限管理,掌握 chmod、chown、chgrp】
linux·运维·服务器
一条破秋裤3 小时前
【1114】【并发控制】【笔记】
linux
2035去旅行4 小时前
ADB的底层原理
linux·adb·嵌入式·arm·soc
武子康4 小时前
单卡 A6000 跑 Qwen-Drive:怎样留下可比较的第一条基线?
linux·人工智能·深度学习
女神下凡4 小时前
芯参谋(107):杰理AC_中科蓝讯_开发指南
linux·服务器·网络·单片机·嵌入式硬件
落羽的落羽4 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
爱和冰阔落9 小时前
【Linux网络】TCP 半包粘包怎么解决?从长度报头、JSON 拆包到网络计算器完整实战
linux·运维·网络·tcp/ip
say_fall11 小时前
【Linux网络编程】UDP套接字编程:系统编程组件、基础回显服务、InetAddr与地址转换、翻译服务与线程池聊天室
linux·服务器·网络·udp·vr
ö Constancy11 小时前
一台电脑的硬件组成与作用:按功能分类详解(Windows 与 Linux 视角)
linux·windows·电脑
江湖有缘11 小时前
基于Ubuntu部署SoduWork:企业级 AI 原生协同平台实战全流程
linux·人工智能·ubuntu·ai·soduwork