VMIN = 0 + select(),可能的内核错误?

时间:2015-10-18 11:52:48

标签: linux io terminal kernel

更新: Simple Proof of Concept,说明不同的行为。

假设我使用tcgetattrtcsetattr设置VMIN = 0, VTIME = 0并删除ICANON,将终端设置为原始模式。 从stdin调用read()永远不会阻止。我是对的吗?

我的问题是:我应该期待stdin上的select()立即返回吗?
从手册页:

  

select()pselect()允许程序监视多个文件描述符,等待一个或多个文件描述符为某些类“准备好”   I / O操作(例如,输入可能)。如果可以执行相应的I / O操作(例如,read(2)),则认为文件描述符已准备就绪   不阻止

基于此,我的第一个答案是“是”。但是,在实践中,在我测试过的大多数Linux系统上都会阻塞,但它并没有阻止某些系统。 这是内核错误吗? 是否建议以这种方式使用VMIN = 0select()

1 个答案:

答案 0 :(得分:0)

问题可能是:VMINVTIME的数组条目有两个目的。参考POSIX termios

  

VMIN和VTIME下标可能分别与VEOF和VEOL下标具有相同的值。

程序在规范模式下读取attributes值,然后将其更改为非规范,并将VMIN设置为零。但是version shownVTIME没有任何作用(与问题中的描述不符)。

例如,请参阅 Understanding UNIX termios VMIN and VTIME (同样,对于termios的Linux manual page),其中注意到VMINVTIME都是零,那么你可以完全无阻塞读。

termios手册页给出VEOL的初始值为零,而stty manual页面将<undef>等同_POSIX_VDISABLE(非零)(同意{{3} }})。 POSIX似乎没有为eol指定初始值。

正常VEOL<undef>,如stty -a所示。也许在你获得非阻塞读取的机器上,情况并非如此。这不一定是内核错误,但可能是TTY的配置问题。