BBS水木清华站∶精华区
发信人: forest (轻寒小楼~~心止), 信区: Unix
标 题: 从终端立即得到输入字符,而不等待回车键-cpu系列[转
发信站: BBS 水木清华站 (Tue Jan 4 17:43:55 2000)
发信人: scz (小四), 信区: Solaris
标 题: 从终端立即得到输入字符,而不等待回车键 -- cpu系列
发信站: 华南网木棉站 (Wed Dec 29 13:39:54 1999), 转信
类似这样的问题已经被问过很多次,但很少有兄弟肯给一个立刻能够得到检验
随之可以照猫画老虎的例子,大多都是含混不清的卖弄两句。其实木棉站的
cpu 大哥早就给出个解答了,甚至更早,在 cpu 大哥当初转贴出来的
Unix Programming FAQ 中有源代码例子。我是以前搞 curses 编程的时候碰上
这个问题的,当时是在 solaris/sco unix/irix 下 man 出来的结论,结果这次
在 redhat6.0 下发现有点小小改动,更倒霉的是 man手册 不全,所以只好建议
你去 man stty 以了解 c_cc 的意义。下面的代码就是 FAQ 中的,如果你看到
有用 ioctl() 的,那是一个道理。还是很想再次推荐大家去看看华南木棉
solaris版 的精华区以及 unix版 的精华区,至少这份 FAQ 很有意思。给的代码
仅仅是个演示,如果你想进入无阻塞键盘输入状态,让那个注释掉的行生效再看
看,比较前后两种情况下用 top 命令看到的不同,不多说啦。
终端一般处在 canonical 模式,此时输入是按行进行的。
你可以设置终端进入 non-canonical 模式。
man tcgetattr | tcsetattr | termios
more /usr/include/bits/termios.h
man stty
g++ -O3 -o keypress keypress.c
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <termios.h>
static struct termios originalTermParam;
{
struct termios currentTermParam;
memcpy( ¤tTermParam, &originalTermParam, sizeof( struct termios ) );
currentTermParam.c_lflag &= ~ICANON; /* 不设置则允许最快速的读取字符
*
/
currentTermParam.c_lflag &= ~ECHO; /* 不回显 */
currentTermParam.c_cc[ VTIME ] = 0;
currentTermParam.c_cc[ VMIN ] = 1; /* 至少等待输入一个字符 */
// currentTermParam.c_cc[VMIN] = 0;
tcsetattr( 0, TCSANOW, ¤tTermParam );
return;
} /* end of set_keypress */
void reset_keypress ( void )
{
tcsetattr( 0, TCSANOW, &originalTermParam );
return;
} /* end of reset_keypress */
int main ( void )
{
puts( "main start" );
set_keypress();
while ( 1 )
{
if ( getchar() == ( int )'q' )
{
break;
}
}
reset_keypress();
puts( "main stop" );
return 0;
} /* end of main */
--
风 属于天的 我借来吹吹 却吹起人间烟火
天 属于谁的 我借来欣赏 却看到你的轮廓
※ 来源:·BBS 水木清华站 smth.org·[FROM: 202.116.9.59]
BBS水木清华站∶精华区