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( &currentTermParam, &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, &currentTermParam ); 
    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水木清华站∶精华区