linux程序设计复习总结(四)终端

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;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值