LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1520|回复: 7

如何在linux下设置终端让用户输入的字符被立即送到程序,并且不回显?

[复制链接]
发表于 2005-11-25 17:07:15 | 显示全部楼层 |阅读模式
如何在linux下设置终端让用户输入的字符被立即送到程序,并且不回显?各位大侠讲讲吧,真的很急用,谢谢啦!
发表于 2005-11-26 11:07:52 | 显示全部楼层
自己写程序,
设定把回显功能关掉
把缓存功能关掉
把输入的字符送到你指定的程序。即可。
退出程序时,打开回显,与缓存功能。
回复 支持 反对

使用道具 举报

发表于 2005-11-26 22:50:18 | 显示全部楼层
  1. #include<termios.h>
  2. #include<stdio.h>
  3. #include<unistd.h>

  4. static struct termios attr;

  5. void set(){
  6.         struct termios temp;

  7.         tcgetattr(0, &attr);
  8.         memcpy(&temp, &attr, sizeof(struct termios));

  9.         temp.c_lflag &= ~ICANON;
  10.         temp.c_lflag &= ~ECHO;
  11.         temp.c_cc[VTIME] = 255;
  12.         temp.c_cc[VMIN] = 1;
  13.         tcsetattr(0, TCSANOW, &temp);
  14. }

  15. void reset(){
  16.         tcsetattr(0, TCSANOW, &attr);
  17. }

  18. int main(){
  19.         char c;

  20.         atexit(&reset);

  21.         set();

  22.         while( (c = getchar()) != 'q' )
  23.                 putchar(c);
  24. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-28 11:12:08 | 显示全部楼层
楼上的大哥谢谢你给的程序,不过如何在你给的程序的基础上实现屏幕上按下退格键后光标自动前移,并删除光标的前一个字符?还请这位大侠指教!多谢了!
回复 支持 反对

使用道具 举报

发表于 2005-11-28 16:45:57 | 显示全部楼层
都不回显了,光标何在?

不过顺便问一下
什么情况下有你这种需求
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-30 08:35:14 | 显示全部楼层
我现在已经跟据楼上大哥的程序,完成了我所需要的功能,代码如下:可我不清楚temp.c_lflag &= ~ECHO;与temp.c_lflag &=ECHO;有什么区别?是不是用第二个设置后表示回显而第一个表示不回显,可我在下面的程序中试了试这两个语句,效果都不回显,我不清楚为什么?具体需求我是想在vxworks下做到这种效果,先在linux下实现
#include<termios.h>
#include<stdio.h>
#include<unistd.h>

static struct termios attr;
void set(){
        struct termios temp;
        tcgetattr(0, &attr);
        memcpy(&temp, &attr, sizeof(struct termios));
        temp.c_lflag &= ICANON;
        temp.c_lflag &= ~ECHO;
        temp.c_lflag &=ECHOE;
        temp.c_lflag &=ISIG;
        temp.c_cc[VTIME] = 255;
        temp.c_cc[VMIN] = 1;
        temp.c_cc[VERASE]='\b';
        tcsetattr(0, TCSANOW, &temp);
}

void reset(){
        tcsetattr(0, TCSANOW, &attr);
}

int main(){
        char c;
        atexit(&reset);
        set();
        while( (c = getchar()) != 'q')
        {
               putchar(c);
                if(c=='\b')
                {
                        putchar(' ');
                        putchar('\b');
                }
        }
}
回复 支持 反对

使用道具 举报

发表于 2005-11-30 10:50:43 | 显示全部楼层
temp.c_lflag &= ICANON;
temp.c_lflag &= ~ECHO;
temp.c_lflag &=ECHOE;
temp.c_lflag &=ISIG;
这四句的效果和
temp.c_lflag = 0;
一样
如果这是你的本意,不如直接赋0

temp.c_lflag &= ~ECHO;
这是取消回显,把temp.c_lflag里的ECHO位置0

temp.c_lflag &=ECHO;
没有这么用的,

一般某位,比如ECHO
置0的话用 &= ~ECHO
置1的话用 |= ECHO

temp.c_cc[VERASE]='\b';
难道这真是你要求的么?
这样做的后果是,只有输入ascii值8才能退格
好在是可以输入的
就是按住ctrl不松手,然后连续按v,h
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-30 18:59:30 | 显示全部楼层
谢谢楼上大哥的讲解,小弟真是受益颇多呀!多谢啦
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表