假设我使用读取描述符调用* nix select(read_fd, ...)
,该描述符不是从文件中获取的,而是进程的控制终端。当这返回时,意味着描述符有东西要为我阅读。
select
的手册页说在EOF的情况下它可能是0个字符,因此当我调用read()
时,我不会阻止但不会获得任何字符。
但是对于控制终端文件描述符,这种EOF效应不会发生,可以吗?
答案 0 :(得分:1)
是的,它可以。有几种情况,但简而言之,控制终端可以是UNIX中的任何东西。您可以在pty(伪tty)下启动进程,并将其作为其控制终端插入另一个进程。如果该过程或pty消失,您的文件描述符将被关闭,您将获得EOF。所需要的只是将进程的描述符映射到0,1和2.这些可以是网络套接字,管道,文件等。
进程也可以关闭其描述符以切断与其控制终端的连接,因此我确定读取将返回0。
自从我写了一个telnetd服务器已经20年了,所以我离开了遥远的记忆,但我很确定我在这里是正确的。如果我的回答太模糊,那么推荐这本书的好书就是W. Richard Steven在UNIX环境中的高级编程,它涵盖了各种场景,{{1} },controlling terminals
,ptys
和daemons
在他的另一本书 UNIX网络编程中有详细介绍。