在linux系统中,已知有标准输入、标准输出、标准错误,分别对应0、1、2这3个文件描述符,各进程诞生时,已经左右附带,通过以下命令可以知道:
如上图所示,0、1和2分别绑定到/dev/pts/1。 /dev/pts/1是我这边的终端设备文件。 由于这样的绑定关系,可以在画面上看到标准输出/标准错误。 在系统方面,这三个数字已称为一般规定
系统分配新的文件描述符时,总是从最小且未使用开始,因此根据上述各种因素,可以预测改变文件描述符1、2的方向时会起到重定向器“”的作用。 答案是肯定的!
[root@361way test]# touch 123
[root@361way test]# ls #未更改标准输出的ls结果
123
[ root @ 361路测试] # exec 101 #用exec将文件描述符1的原始绑定结果暂时保存在文件描述符10中
[ root @ 361 way test ] # exe C1 stdout.log #用exec将文件描述符1绑定到stdout.log
[ root @ 361路测试] # ll/proc/$ $/FD
[ root @ 361 way test ] # echo ' www.361 way.com '
###以上的指令不输出###
[ root @ 361 way test ] # cat stdout.log #这存在标准错误。 这个提示很有趣。
cat : stdout.log : inputfileisoutputfile
[root@361way test]# exec 110 #撤消文件描述符1
[ root @ 361路测试] # ls
123 stdout.log
[ root @ 361 way test ] # cat stdout.log #查看刚才绑定的文件,里面的结果是刚才的ls和echo的结果
总0
lwx---1 root root 64 aug 1615336042--/dev/pts/1
l----1root root 64 aug 16153360421---tmp/test/stdout.log #对应于上述exec 1stdout.log
lwx---1 root root 64 aug 161533604410--/dev/pts/1
lwx----1路由64aug1615336042----/dev/pts/1
lwx----1root root 64 aug 1615336044255---dev/pts/1
www.361way.com
执行以上实验时,请注意以下事项。
1、运行exec 1stdout.log时,会发现vim、nano、cat、less、more、ls等与标准输出有关,屏幕上的命令将无法正常使用。
2、不通过中间描述符10,就不能恢复原来的标准输出。 但是,执行这项修正后也并不是一直有问题。 断开连接并重新登录后,或者连接到exec 1stdout.log时无效。 这是因为,新连接时,0、1可能与/dev/pts/2或/dev/pts/3相对应。
3、/proc/$$/fd中的0、1、10等不能通过ln命令链接到/dev/pts/num或随意删除。
[root@361way fd]# pwd
/proc/48226/fd
[root@361way fd]# ll
总0
lwx----1路由64aug1615336055----/dev/pts/1
lwx----1路由64aug16153360551----/dev/pts/1
lwx---1 root root 64 aug 161533605610--/dev/pts/1
lwx----1路由64aug16153360552----/dev/pts/1
lwx----1root root 64 aug 1615336055255---dev/pts/1
[root@361way fd]# pwd
/proc/48226/fd
[ root @ 361 way FD ] # ln-s/dev/pts/1100
LN :故障恢复系统‘100’:无文件目录
[root@361way fd]# rm -rf 10
RM : cannot remove‘10’:操作性
对于标准输出是如此,对于标准错误也是如此。 针对标准错误执行上述实验时,会发现不可思议的问题。 多么不可思议,请看代码:
为什么会变成这样的结果,如果重定向错误输出就会变成这样的话,不是就可以说明我们看到的显示实际上是标准错误的内容吗?
从stderr.log文件的输出中可以确认,在我们的登录终端上看到的命令提示等,都以标准错误展示在我们面前。 这样好像和我们的理解有点不一样呢。 为什么不用标准输出呢? 经常会引起误会呢。 其实,了解系统标准IO的三种缓冲模式,就能知道为什么系统会因为标准错误而展示:
三种缓冲模式:
完整缓冲区:在缓冲区已满之前不调用系统I/O函数。 (通常相对于文件)
行缓冲器:在遇到换行符时被输出(标准输出) )。
无缓冲区:没有缓冲区。 数据将立即读取或输出到外部文件或设备(标准错误)。
一般来说,无缓冲是最慢的,但存在是合理的,其作用是尽快展示内容。 所以,现在很容易理解为什么命令提示符需要以标准错误输出。 因为我们不能总是等着回到滑架上~
如上所述,我们可以通过改变文件描述符1/2的绑定来实现重定向,实际上,系统也使用了这样的类似方法,但系统一般使用dup2/fcntl函数,这些也是