《unix-linux编程实践教程》第一章more命令的后续内容

 more的更完善版本需要对终端参数的获取和设置,以下是详细内容:使用tcgetattr函数与tcsetattr函数控制终端


 

在UNIX系统中,提供了一组可以控制terminal driver的程序。
在应用程序与底层的Terminal Dirver之间,为一般的读写控制器。

这种方式是我们研究的主要方式。

Struct termios符合POSIX规范。 termios 函数族提供了一个常规的终端接口,用于控制非同步通信端口 。终端设备主要由termios结构中所定的值,以及一些函数的呼叫加以控制。
Termios结构参数值可分为:输入模式、输出模式、控制模式、本地模式 、特殊控制字元五类
其定义如下:
#include <termios.h>
struct termios {
       tcflag_t c_iflag;                 /*input mode*/
       tcflag_t c_oflag;             /*output mode*/
       tcflag_t c_cflag;             /*control mode*/
       tcflag_t c_lflag;               /*local mode*/
       cc_t     c_cc[NCCS];               /* 特殊控制字元*/

}

Input mode ( 输入模式)
Input mode可以在输入值传给程序之前控制其处理的方式
其中输入值可能是由序列埠或键盘的终端驱动程序所接收到的字元。
我们可以利用termios结构的c_iflag的标志来加以控制,其定义的方式皆以OR来加以组合。
c_iflag的巨集:
         BRKINT    命令行出现中断时,可产生一插断
         IGNBRK      忽略命令行中的中断
         IGNCR               忽略收到的RETURN
         ICRNL         将收到的RETURN传回下一行
         INLCR         将收到的换行符号转换为Return
         IGNPAR       忽略带有同位错误的字元
         PARMRK     标志同位错误
         INPCK         对字元进行同位检查
         ISTRIP            刪除所有汇入的字元(预设为7位元)
         IXOFF         设定软件的输入数据流(FLOW)
         IXON          设定软件的输出数据流(FLOW)

 

Output mode ( 输出模式)
Output mode主要负责控制输出字元的处理方式
输出字元在传送到序列埠或显示器之前是如何被程序来处理。
输出模式是利用termios结构的c_oflag的标志来加以控制,其定义的方式皆以OR来加以组合。
c_oflag的巨集:
         OPOST               启用具体实现自行定义的输出处理
         ONLCR               将输出中的新行符映射为       回车(RETURN 键)-换行
         ONOCR              不在第 0 列输出回车
         ONLRET             不输出回车,换行也会执行Return
         OFILL                发送填充字符作为延时,而不是使用定时来延时
         OFDEL               填充字符是 ASCII DEL (0177)。如果不设置,填充字符则是 ASCII NULL
         OCRNL               忽将任何RETURN键输出转换为换行。
         FFDLY                进表延时掩码。取值为 FF0 或 FF1。
         NLDLY               新行延时掩码。取值为 NL0 和 NL1。
         CRDLY               回车延时掩码。取值为 CR0, CR1, CR2, 或 CR3。
         TABDLY             水平跳格延时掩码。取值为 TAB0, TAB1, TAB2, TAB3 (或 XTABS)。取值为 TAB3,即 XTABS,将扩展跳格为空格 (每个跳格符填充 8 个空格)。

         BSDLY        回退延时掩码。取值为 BS0 或 BS1。

Control mode ( 控制模式)
Control mode主要用于控制终端设备的硬件设置。
利用termios结构的c_cflag的标志来加以控制
控制模式用在序列线连接到数据设备时,也可以用在与终端设备的交谈。
一般来说,改变终端设备的组态要比使用termios的控制模式来改变行(lines)的行为来得容易。
c_oflag的巨集:
         CREAD               打开字元的接受者
         CLOCAL             忽略 modem 控制线
         CS5                    传送或接收字元时用5bits
         CS6                    传送或接收字元时用6bits
         CS7                    传送或接收字元时用7bits
         CS8                    传送或接收字元时用8bits
         CSTOPB             每一字元使用2个停上位元
         HUPCL               在最后一个进程关闭设备后,降低 modem 控制线 (挂断)。
         PARENB             允许输出产生奇偶信息以及输入的奇偶校验(启用同位产生与侦测)
         PARODD            输入和输出是奇校验(使用奇同位而非偶同位)
Local mode ( 局部模式)
Local mode主要用来控制终端设备不同的特色
利用termios结构里的c_lflag的标志来设定局部模式
在巨集中有两个比较重要的标志
一为ECHO,它可以让你阻止键入字元的回应。
另一个为ICANON(正规模式)标志,它可以对所接收的字元在两种不同的终端设备模式之间来回切换。
c_lflag的巨集:
         ECHO                 回显输入字符
         ECHOE               如果同时设置了 ICANON,字符 ERASE 擦除前一个输入字符,WERASE 擦除前一个词。
         ECHOK               如果同时设置了 ICANON,字符 KILL 删除当前行。
         ECHONL             如果同时设置了 ICANON,回显字符 NL,即使没有设置 ECHO。
         ICANON            启用标准模式 (canonical mode)。允许使用特殊字符 EOF, EOL, EOL2, ERASE, KILL, LNEXT, REPRINT, STATUS, 和 WERASE,以及按行的缓冲。
         ISIG                   当接受到字符 INTR, QUIT, SUSP, 或 DSUSP 时,产生相应的信号。
         IEXTEN              启用实现自定义的输入处理。这个标志必须与 ICANON 同时使用,才能解释特殊字符 EOL2,LNEXT,REPRINT 和 WERASE,IUCLC 标志才有效。(启动特殊函数之执行)
         NOFLSH             关闭queue中的flush
         TOSTOP             向试图写控制终端的后台进程组发送 SIGTTOU 信号(传送欲写入的信息到后台处理)。

 

特殊控制字元
可提供使用者设定一些特殊的功能
如Ctrl+C的字元组合。
特殊控制字元主要是利用termios结构里c_cc的阵列成员来做设定。
c_cc阵列主要用于正规与非正规两种环境,但要注意的是正规与非正规不可混为一谈。
正规模式的c_cc阵列:
         VEOF      EOF 字元
         VEOL      EOL 字元
         VERASE    ERASE 字元
         VINTR      INTR 字元
         VKILL      KILL 字元
         VQUIT     QUIT 字元   
         VSUSP     SUSP 字元
         VSTART     START 字元
         VSTOP        STOP 字元
非正规模式的c_cc阵列:
         VINTR      INTR 字元
         VQUIT      QUIT 字元
         VSUSP      SUSP 字元
         VSTART     START 字元   
         VSTOP        STOP 字元
         VMIN      MIN 值
         VTIME        TIME 值
下表为一些字元的描述
字元
描述
INTR
使terminal driver传送SIGINT信号到终端。
QUIT
使terminal driver传送SIGQUIT信号到终端。
ERASE
使terminal driver刪除此行的最后一个字元。
KILL
使terminal driver刪除整行。
EOF
使terminal driver将此行所有的字元传送到读取输入的应用程序,如果此行为空行,则read呼叫就传回0字元,就和读到档尾一样。
EOL
此一字元就像一个行的终止符号。
SUSP
使terminal driver传送SIGSUSP信号到终端相连接的process。
STOP
此一字元可以防止对终端的进一步输入,主要被用来支援XON/XOFF的数据流控制。
START
此字元在STOP字元之后重新开始输出。
MIN与TIME
MIN主要是表示能满足read的最小字元数。
TIME是代表一个十分之一秒的timer。
MIN与TIME组合有以下四种:
1、 MIN = 0 , TIME =0
              有READ立即回传
              否则传回 0 ,不读取任何字元
2、 MIN = 0 , TIME >0
              READ 传回读到的字元,或在十分之一秒后传回TIME
       若来不及读到任何字元,则传回0
3、 MIN > 0 , TIME =0
              READ 会等待,直到MIN字元可读
4、 MIN > 0 , TIME > 0
              每一格字元之间计时器即会被启动
              READ 会在读到MIN字元,传回值或TIME的字元计时(1/10秒)超过时将值传回
    

//p6.2.c 修改终端控制字符示例
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <errno.h>

int main(void){
//term用于存储获得的终端参数信息
struct termios term;
int err;

//获得标准输入的终端参数,将获得的信息保存在term变量中
if(tcgetattr(STDIN_FILENO,&term)==-1){
perror("Cannot get standard input description");
return 1;
}

//修改获得的终端信息的结束控制字符
term.c_cc[VEOF]=(cc_t)0x07;

//使用tcsetattr函数将修改后的终端参数设置到标准输入中
//err用于保存函数调用后的结果
err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term);

//如果err为-1或是出现EINTR错误(函数执行被信号中断),
//给出相关出错信息
if(err==-1 && err==EINTR){
perror("Failed to change EOF character");
return 1;
}

return 0;
}

其他重要的函数:tcgetattr、tcsetatt
一个为tcgetattr函数
此呼叫以将当前终端介质的参数值写入termios_p所指向的结构
其原型如下:
       #include <termios.h>
       int tcgetattr(int fd,struct termois termios_p);
       /* 取得终端介质初始值*/
另一个为tcsetatt函数
此函数可以依actions栏位来对终端介质的参数做设定
其原型如下:
       int tcsetattr(int fd,int actions,const struct    termios *termios_p);
其action栏位有TCSANOW、TCSADRAIN及TCSAFLUSH三种可能:
Action 栏位
描述
TCSANOW
立即将值改变
TCSADRAIN
当前输出完成时将值改变
TCSAFLUSH
同TCSADRAIN,但会舍弃当前所有值
基于STM32F407,使用DFS算法实现最短迷宫路径检索,分为三种模式:1.DEBUG模式,2. 训练模式,3. 主程序模式 ,DEBUG模式主要分析bug,测量必要数据,训练模式用于DFS算法训练最短路径,并将最短路径以链表形式存储Flash, 主程序模式从Flash中….zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值