可以是*nix进程读取()EOF的控制终端



假设我用一个读描述符调用*nix select(read_fd, ...),该描述符不是从文件中获得的,而是进程的控制终端。当它返回时,这意味着描述符有东西要读

select的手册页说,在EOF的情况下,它可能是0个字符,所以当我调用read()时,我不会阻塞,但不会得到任何字符。

但是这种EOF效应不可能发生在控制终端文件描述符上,是吗?

可以。有几种场景,但简而言之,控制终端可以是UNIX中的任何东西。您可以在pty(伪tty)下启动一个进程,并将其作为控制终端插入另一个进程。如果该过程或pty消失,您的文件描述符将被关闭,您将获得EOF。所需要的只是将进程的描述符映射到0、1和2。这些可能是网络套接字、管道、文件等。

进程也可以关闭其描述符来切断与控制终端的连接,所以我确信读取会返回0。

我写telnet服务器已经有20年了,所以我要离开遥远的记忆,但我很确定我在这里是正确的。如果我的答案太模糊的话,关于这方面的一本很好的书是W.Richard Steven的《UNIX环境中的高级编程》,它涵盖了各种场景,controlling terminalsptysdaemonsselect()在他的另一本书《UNIX网络编程》中有详细的介绍。

最新更新