问题:希望每输入一个字符,终端就能得到,而不需要输入CR或者LF字符。一开始觉得需要设置标准输入为无缓冲模式,但是我使用的是read函数,总之没有成功。然后我把read设置成非阻塞,依然没用。然后我找到了下面的方法:
《Linux高级程序设计》默认方式下,所有的输入字符都将缓冲在一个buffer空间中,直到用户输入CR或者LF字符才发送。输入内容的回显由本端完成,即用户输入一个字符,该字符直接回显。选用默认方式的代码段如下:
options.c_lflag |=(ICANON|ECHO|ECHOE);
如果想设置成每输入一个字符都将立即被发送到服务器,并且不在终端上回显,则需要设置成
options.c_lflag &=~(ICANON|ECHO|ECHOE);
示例:
#include <termios.h>
void setTerm(void){
struct termios option;
tcgetattr(0,&option);
option.c_lflag &=~(ICANON|ECHO|ECHOE);
tcsetattr(0,TCSANOW,&option);
}
恢复成默认状态
#include <termios.h>
void recoverTerm(void){
struct termios option;
tcgetattr(0,&option);
option.c_lflag |=(ICANON|ECHO|ECHOE);
tcsetattr(0,TCSANOW,&option);
}
其中struct termios是管理终端属性的结构体。
猜测不成功的原因是终端没有发送收到的字符,所以不管read是否阻塞,都不会有数据读入。
从《Linux高级程序设计》中可以看出,终端肯定是有缓冲的。而标准输入输出流也是有缓冲的。