C termios.h 简单用法

ermios 结构是在POSIX规范中定义的标准接口,它类似于系统V中的termio接口,通过设置termios类型的数据结构中的值和使用一小组函数调用,你就可以对终端接口进行控制。

  1. 使用termios结构的密码程序
#include   
#include   
#include   
#define PASSWORD_LEN 8  
int main()  
{  
    struct termios initialrsettings, newrsettings;  
    char password[PASSWORD_LEN + 1];  
    tcgetattr(fileno(stdin), &initialrsettings);  
    newrsettings = initialrsettings;  
    newrsettings.c_lflag &= ~ECHO;  
    printf("Enter password: ");  
    if(tcsetattr(fileno(stdin), TCSAFLUSH, &newrsettings) != 0) {  
        fprintf(stderr,"Could not set attributes\n");  
    }  
    else {  
        fgets(password, PASSWORD_LEN, stdin);  
        tcsetattr(fileno(stdin), TCSANOW, &initialrsettings);  
        fprintf(stdout, "\nYou entered %s\n", password);  
    }  
    exit(0);  
}  
  1. 读取每一个字符
#include   
#include   
#include   
#include   
char *menu[] = {  
    "a - add new record",  
    "d - delete record",  
    "q - quit",  
    NULL,  
};  
int getchoice(char *greet, char *choices[], FILE *in, FILE *out);  
int main()  
{  
    int choice = 0;  
    FILE *input;  
    FILE *output;  
    struct termios initial_settings, new_settings;  
    if (!isatty(fileno(stdout))) {  
        fprintf(stderr,"You are not a terminal, OK.\n");  
    }  
    input = fopen("/dev/tty", "r");  
    output = fopen("/dev/tty", "w");  
    if(!input || !output) {  
        fprintf(stderr, "Unable to open /dev/tty\n");  
        exit(1);  
    }  
    tcgetattr(fileno(input),&initial_settings);  
    new_settings = initial_settings;  
    new_settings.c_lflag &= ~ICANON;  
    new_settings.c_lflag &= ~ECHO;  
    new_settings.c_cc[VMIN] = 1;  
    new_settings.c_cc[VTIME] = 0;  
    new_settings.c_lflag &= ~ISIG;  
    if(tcsetattr(fileno(input), TCSANOW, &new_settings) != 0) {  
        fprintf(stderr,"could not set attributes\n");  
    }  
 
    do {  
        choice = getchoice("Please select an action", menu, input, output);  
        printf("You have chosen: %c\n", choice);  
    } while (choice != 'q');  
    tcsetattr(fileno(input),TCSANOW,&initial_settings);  
    exit(0);  
}  
int getchoice(char *greet, char *choices[], FILE *in, FILE *out)  
{  
    int chosen = 0;  
    int selected;  
    char **option;  
    do {  
        fprintf(out, "Choice: %s\n",greet);  
        option = choices;  
        while(*option) {  
            fprintf(out, "%s\n",*option);  
            option++;  
        }  
        do {  
            selected = fgetc(in);  
        } while (selected == '\n' || selected == '\r');  
        option = choices;  
        while(*option) {  
            if(selected == *option[0]) {  
                chosen = 1;  
                break;  
            }  
            option++;  
        }  
        if(!chosen) {  
            fprintf(out, "Incorrect choice, select again\n");  
        }  
    } while(!chosen);  
    return selected;  
}

示例1
关闭终端回显,键盘输入的字符不会在终端窗口显示。


 #include 
 #include 
 #include 
 #include 
 
 
int main(void)
{
struct termios ts,ots;
char passbuf[1024];
 
tcgetattr(STDIN_FILENO,&ts); /* STDIN_FILENO的值是1,表示标准输入的文件描述符 */
ots = ts;
 
ts.c_lflag &= ~ECHO; /* 关闭回终端回显功能*/
ts.c_lflag |= ECHONL;
tcsetattr(STDIN_FILENO,TCSAFLUSH,&ts); /* 应用新终端设置 */
 
fgets(passbuf,1024,stdin); /* 输入字符不会在终端显示 */
printf("you input character = %s/n",passbuf);
 
tcsetattr(STDIN_FILENO,TCSANOW,&ots); /* 恢复旧的终端设备 */
}

示例2:
自定义的不带回显的mygetch()函数

int mygetch()
{
        int ch;
        struct termios oldt,newt;
        tcgetattr(STDIN_FILENO,&oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO,TCSANOW,&newt);
        ch = getchar(); 
        tcsetattr(STDIN_FILENO,TCSANOW,&oldt);
    return ch;
}

你可能感兴趣的:(C语言库)