1.Linux和UNIX提供了一个特殊设备/dev/tty,该设备始终是指向当前终端或当前的登录会话。由于Linux把一切事物都看作为文件,所以可以用一般文件的操作方式来对/dev/tty进行读写。
int case50()
{
printf("\n\ncase50:\n");
int n = 0;
int tmp[64] = {0};
FILE *input = NULL;
FILE *output = NULL;
input = fopen("/dev/tty", "r");
output = fopen("/dev/tty", "w");
if(!input || !output)
{
fprintf(stderr,"Unable to open /dev/tty\n");
return -1;
}
do
{
tmp[n] = fgetc(input);
if('\n' == tmp[n] || n >= 62)
{
break;
}
n++;
}while(1);
n = 0;
while(tmp[n])
{
fprintf(output,"%c",tmp[n]);
n++;
}
fprintf(output,"\n%s\n","hello!");
fclose(input);
fclose(output);
return 0;
}
打开tty,读取内容,暂存,再写到tty
2.有时,程序需要更精细的终端控制能力,而不是仅通过简单的文件操作来完成对终端的一些控制。Linux提供了一组编程接口用来控制终端驱动程序的行为,从而使得更好地控制终端的输入和输出。
3.termios是在POSIX规范中定义的标准接口,通过设置termios类型的数据结构中的值和使用一小组函数调用,可以对终端接口进行控制。termios数据结构和相关函数调用都定义在头文件termios.h中。
4.可以被调整来影响终端的值按照不同的模式被分成如下几组:输入模式,输出模式,控制模式,本地模式,特殊控制字符。
输入模式控制输入数据在被传递给程序之前的处理方式。通过设置termios结构中c_iflag成员的标志对它们进行控制。所有的标志都被定义为宏,并可通过按位或的方式结合起来。
输出模式控制输出字符的处理方式,即由程序发送出去的字符在传递到串行口或屏幕之前是如何处理的。通过设置termios结构中c_oflag成员的标志对输出模式进行控制。
控制模式控制终端的硬件特性。通过设置termios结构中c_cflag成员的标志对控制模式进行配置。
本地模式控制终端的各种特性。通过设置termios结构中c_lflag成员的标志对本地模式进行配置。
特殊控制字符是一些字符组合,如Ctrl+C,当用户键入这样的组合键时,终端会采取一些特殊的处理方式。termios结构中的c_cc数组成员将各种特殊控制字符映射到对应的支持函数。
函数tcgetattr来初始化与一个终端对应的termios结构,获取当前设置到程序中
int tcgetattr(int fd,struct termios *termios_p);
函数tcsetattr重新配置终端接口
int tcsetattr(int fd,int actions,const struct termios *termios_p);
参数actions控制修改方式:TCSANOW立刻修改,TCSADRAIN当前输出完成后修改,TCSAFLUSH当前输出完成后修改,丢弃还未从read调用返回的当前可用的任何输入。
shell下查看当前的termios设置情况:stty -a
保存当前设置:stty -g > save_stty
改termios取消回显实验
#include <termios.h>
#include <stdio.h>
#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);
}
return 0;
}