一起talk C栗子吧(第一百七十一回:C语言实例--关闭终端中的回显功能二)


各位看官们,大家好,上一回中咱们说的关闭终端中回显功能的例子,这一回咱们继续说该例子是 。闲话休提,言归正转。让我们一起talk C栗子吧!


看官们, 我们在前一章回中介绍了如何关闭终端中的回显功能,当时是借助系统命令stty实现该功能的,这一回中我们将介绍另外一种关闭终端中回显功能的方法。该方法是通过终端的编程接口来操作终端的。

在Linux中比较常用的是POSIX标准中的termios接口。在介绍termios接口前,我们先介绍一下termios类型。

该类型是一个结构体类型,它的定义位于头文件/usr/include/i386-linux-gnu/bits/termios.h中, 详细的定义如下:

struct termios
  {
    tcflag_t c_iflag;           /* input mode flags */
    tcflag_t c_oflag;           /* output mode flags */
    tcflag_t c_cflag;           /* control mode flags */
    tcflag_t c_lflag;           /* local mode flags */
    cc_t c_line;                /* line discipline */
    cc_t c_cc[NCCS];            /* control characters */
    speed_t c_ispeed;           /* input speed */
    speed_t c_ospeed;           /* output speed */
  };

该类型的每个成员用来控制一个终端中的模式,比如成员c_iflag用来控制终端的输入模式,大家可以从每个成员后面的英文注释中明白成员的作用,这里就不一一介绍了。

我们今天主要讨论c_lflag成员,它主要用来控制本地终端的特性,它的类型是tcflag_t,该类型本质上是无符号int类型,原因如下:
typedef unsigned int tcflag_t;

该成员的值是一些宏变量,具体如下:

/* c_lflag bits */
#define ISIG    0000001
#define ICANON  0000002
...  //省略一部分
#define ECHO    0000010
#define ECHOE   0000020
#define ECHOK   0000040
#define ECHONL  0000100
...  //省略一部分,这些宏定义也在termios.h头文件,可以自己去查看。

我们重点关注ECHO这个宏,它的作用是打开本地终端的回显功能。这时有看官说,是不是修改这个值就能关闭终端的回显功能呢?没错,这位看官说的完全正确。可是我们如何修改本地终端中的这个值呢?答案是终端编程接口。接下来我们介绍两个常用的终端编程接口:

       int tcgetattr(int fd, struct termios *termios_p);
  • 该函数用来获取终端中的termios信息;
  • 该函数的第一个参数是终端的文件描述符;
  • 该函数的第二个参数是termios类型的指针变量,用来存放从终端中获取到的termios信息;
  • 该函数运行成功时返回0,否则返回-1,并且设置全局变量errno;
       int tcsetattr(int fd, int optional_actions,
                     const struct termios *termios_p);
  • 该函数用来修改终端中的termios信息;
  • 该函数的第一个参数是终端的文件描述符;
  • 该函数的第二个参数是修改终端的方式,稍后做详细介绍;
  • 该函数的第三个参数是termios类型的指针变量,函数会把终端中的termios信息修改成它指向的内容;
  • 该函数运行成功时返回0,否则返回-1,并且设置全局变量errno;

接下来我们介绍该函数第二个参数的详细信息。

第二个参数的值,有以下三种,分别表示不同的修改方式:

/* tcsetattr uses these */
#define TCSANOW         0 //立即修改终端中的termios信息
#define TCSADRAIN       1 //等待当前的输入操作完成后再修改终端中的termios信息
#define TCSAFLUSH       2 //等待当前的输入操作完成后再修改终端中的termios信息,但是会丢弃还没有从read()函数返回的输入内容;

各位看官,关于关闭终端中回显功能的例子”咱们就说到这里。欲知后面还有什么例子,且听下回分解 。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

talk_8

真诚赞赏,手有余香

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值