$ ls -l / dev / fd /lrwx ------ 1 me me 64 2009-09-17 16:52 0-> / dev / pts / 4lrwx ------ 1 me me 64 2009-09-17 16:52 1-> / dev / pts / 4lrwx ------ 1 me me 64 2009-09-17 16:52 2-> / dev / pts / 4
在交互式终端上登录时,所有三个标准文件描述符都指向同一件事:您的TTY(或伪TTY)。
$ ls -fl / dev / std {in,out,err}lrwxrwxrwx 1根根4 2009-09-13 01:57 / dev / stdin-> fd / 0lrwxrwxrwx 1根根4 2009-09-13 01:57 / dev / stdout-> fd / 1lrwxrwxrwx 1根根4 2009-09-13 01:57 / dev / stderr-> fd / 2按照惯例,我们读出
0和写入
1和
2。但是,没有什么可以阻止我们采取其他行动。
当你的shell运行时
ls -l * |less,它创建了一个从管道
ls的文件描述符
1到
less的文件描述符
0。显然,
less它不再能够从文件描述符中读取用户的键盘输入
0-它会设法将TTY重新找回。
如果
less尚未从终端上拆下,
open("/dev/tty")将给它TTY。但是,如果失败了,该怎么办?
less尝试最后一次获取TTY,假设文件描述符
2附加到了文件描述符附加的同一对象
0上(如果未重定向的话)。
这 不是 故障预防:
$ ls -l * | 少setsid 2> / dev / null
在这里,
less为其分配了自己的会话(因此它不再是终端活动进程组的一部分,从而导致
open("/dev/tty")失败),并且其文件描述符2已更改-
现在
less立即退出,因为它正在输出到TTY,但无法获取任何用户输入。



