假设我使用读取描述符调用* nix select(read_fd, ...)
,该读取描述符不是从文件获得的,而是进程的控制终端。当这返回时,这意味着描述符有一些东西需要读取。可以为* nix进程控制终端读取()EOF吗?
select
的手册页说,在EOF的情况下它可能为0个字符,所以当我拨打read()
时,我不会阻止但不会获得任何字符。
但是这个EOF效应不能发生控制终端文件描述符,可以吗?
假设我使用读取描述符调用* nix select(read_fd, ...)
,该读取描述符不是从文件获得的,而是进程的控制终端。当这返回时,这意味着描述符有一些东西需要读取。可以为* nix进程控制终端读取()EOF吗?
select
的手册页说,在EOF的情况下它可能为0个字符,所以当我拨打read()
时,我不会阻止但不会获得任何字符。
但是这个EOF效应不能发生控制终端文件描述符,可以吗?
是的,它可以。有几种情况,但简而言之,控制终端可以是UNIX中的任何东西。您可以在一个pty(伪tty)下启动一个进程,并将其作为控制终端插入另一个进程。如果该进程或pty消失,您的文件描述符将被关闭,您将得到EOF。所有需要的是将进程的描述符映射到0,1和2.这些可以是网络套接字,管道,文件等。
进程还可以关闭其描述符以断开连接到它的控制终端,所以我确信一个读取然后会返回0.
自从我写了一个telnetd服务器以来,它已经20年了,所以我要远离内存,但我很确定我在这里是正确的。如果我的回答过于含糊,一本好书,是指这个东西是W.理查德·史蒂芬的UNIX环境高级编程,它涵盖了所有种类的场景,controlling terminals
,ptys
,daemons
和select()
覆盖详细他的另一本书UNIX网络编程。