2011-10-12 73 views
1

有谁知道为什么运行下面的代码可能导致所有未来的read()调用该fd(这是stdin)立即返回0而不是输入阻塞?在标准输入读取()返回EOF而不是等待输入

termios newTerminalSettings; 
tcgetattr(inFd, &newTerminalSettings); 
newTerminalSettings.c_lflag &= ~ICANON; 
tcsetattr(inFd, TCSANOW, &newTerminalSettings); 

删除tcsetattr行使read()按预期工作。

也试过:

fcntl(inFd, F_SETFL, 0); 

没有运气。

请注意,我目前有2个不同的终端。在其中一个应用程序中运行会导致读取立即返回。在其他原因中运行读取以阻止输入。会是什么呢?

在此先感谢:-)

摄制来源:

#include <iostream> 
#include <termios.h> 

using namespace std; 

int main(void) { 
    termios newTerminalSettings; 
    tcgetattr(0, &newTerminalSettings); 
    newTerminalSettings.c_lflag &= ~ICANON; 
    tcsetattr(0, TCSANOW, &newTerminalSettings); 

    char readBuf[5000]; 
    cout << "read returned: " << read(0, readBuf, sizeof(readBuf)); 

    return 0; 
} 

回答

0

我觉得你的问题是屏蔽掉ICANON,这反过来又关闭规范模式(允许非规范方式)。根据termios(3)的联机帮助页:

“在非规范模式下,输入立即可用(无需用户输入行分隔符),并禁用了行编辑。

为了避免混乱这篇文章,请参阅手册页,因为它详细解释了这种行为。当read没有任何返回时(如在异步模式下),会发生以下行为。记住

从toptal工程盖尔盖伊

0

记住,tty驱动保持从串行线已经阅读并没有传递给用户的字节 的输入队列,所以不 每个read()调用等待对于实际的I/O - 读取很可能是直接从输入队列满足的 。

参考here