【Linux】基础 IO(文件描述符fd & 缓冲区 & 重定向)

说白了,Linux的IO操作就靠这三个核心玩意儿:文件描述符、缓冲区和重定向。
这三者就像搭积木,缺一个都不行。

文件描述符就是个数字标签。
去年我们跑那个3 000Q级的项目时,后台进程因为fd用超了直接崩溃,最后花大半天找问题。
注意内核默认给进程三个fd(01 2 ),超出要手动调整ulimit-n,别等报EMFILE时才后悔。
dup2 特别好用,但别把旧fd也关了,否则数据就断了。

缓冲区是内存的"缓冲池"。
想想你用printf输出时,它并不会真马上去写硬盘,而是攒到内核缓存里。
去年测试时,我们忘了fsync,结果程序退了数据全丢了。
行缓冲和全缓冲差别大,终端默认行缓冲,写文件默认全缓冲,这个点很多人没注意。

重定向最骚的是2 >&1 之前有个同学写脚本把stderr也重定向到stdout,结果错误信息没了直接报segmentation fault。
但把stderr直接扔/dev/null更干净,适合跑批处理。

我一开始以为管道比exec高级,后来发现大项目里exec效率高得多。
等等,还有个事,用exec后程序就跑在新fd上了,之前open的文件得手动close,这个坑值得试试。

建议先搞懂fd怎么用,再学缓冲区策略,最后玩重定向。
别光看文档,实际跑跑命令,比如ls > a.txt 2 >&1 | grep,慢慢就通透了。

linux日志重定向不输出

上周试过nohup。

2 02 3 年。

我那个朋友。

只丢标准输出。

nohup ./run.sh > /dev/null 2 > log &
> 是重定向。

/dev/null是黑洞。

2 > log把错误丢文件。

这样看log知道错在哪。

完全丢输出。

nohup ./run.sh > /dev/null 2 >&1 &
2 >&1 把错误也丢黑洞。

&1 是标准输出。

所以都丢了。

关键/dev/null。

接收数据就丢。

文件描述符是01 2
0是输入。

1 是输出。

2 是错误。

重定向控制方向。

磁盘满了会出问题。

重定向到/dev/null不会。

算了。

LINUX怎么将标准错误输出重定向_LINUX错误输出重定向方法

我记得有一次,在实验室里,我试图运行一个脚本,它需要从网络上拉取数据,并解析它。
脚本运行得很顺利,但问题来了,当我检查输出日志时,发现其中充斥着大量的错误信息,而这些信息实际上对我的工作并没有什么帮助。
当时,我大概花了2 0分钟才意识到,我只需要把错误信息重定向到一个单独的文件,而不是让它直接显示在终端上。
我试着用命令行,用2 >&1 ,然后是2 >&,然后是2 >&1 >error.log,最后才成功将错误信息单独导出到一个叫error.log的文件中。
这个过程让我深刻体会到,命令行的强大和灵活,也让我明白了正确使用重定向的重要性。
等等,我还突然想到,如果当时我直接使用ls/wrong/path2 >/dev/null,可能更快就能解决这个问题了。