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

为什么会显示不正确结果






