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



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



看官们, 我们在上一回中介绍了如何关闭终端中的缓冲功能,当时是借助系统命令stty实现该功能的,这一回中我们将介绍另外一种关闭终端中回显功能的方法。该方法是通过终端的termios编程接口来操作终端的。关于termios接口的介绍和编程接口,我们在一百七十一回中介绍过了,因此,我们直接介绍如何通过termios编程接口来关闭终端缓冲功能。

下面是详细的操作步骤,请大家参考:

  • 1.使用函数tcgetattr()获取终端中的配置信息,并且备份该信息,以便恢复终端最初的配置时使用;
  • 2.修改步骤1中获取到的终端配置信息,我们修改的是与缓冲功能相关的配置;
  • 3.结合步骤2中修改后的终端配置信息,然后使用函数tcsetattr()修改终端中的配置信息;
  • 4.使用备份的终端配置信息,回复终端最初的配置,这时也会用到函数tcsetattr()

看官们,该步骤是不是看着有种似曾相识感觉?哈哈,其实该步骤和关闭回显功能的步骤十分类似,步骤中只有一点不同,那就是在步骤2中修改的内容不同。

下面是具体的代码,请大家参考:

    //源代码
    tcgetattr(fd,&init_setting);   //get the setting of terminal
    change_setting = init_setting; //backup the setting of terminal
    change_setting.c_lflag &= ~ICANON; //close buffer function by change bit of ICANON

    printf("--- buffer function is closed ---\n");
    printf("please input a charater \n");

    res = tcsetattr(fd,TCSAFLUSH,&change_setting); //change the setting of terminal
    ch = getchar();
    if(0 != ch)
    {
        tcsetattr(fd,TCSANOW,&init_setting); //revert the setting of terminal
        printf("\ninput is : %c \n",ch);    //show \n firstly
    }

代码中有一个文件描述符fd,我们可以通过fileno()函数从流中获取流的文件描述符。此外,我们在修改终端配置信息时使用了前面章回中的方法:使用了位操作“与”把终端配置信息中的ICANON值删除掉。此外,我们在修改终端配置信息时使用了两种修改方式:TCSAFLUSH和TCSANOW。这两种修改方式在前面章回中已经介绍过,这里不做详细介绍。

看官们,以上是核心代码,完整的代码放到了我的资源中,大家可以点击这里下载使用。

下面是程序的运行结果,请大家参考:

--- buffer function is open ---
please input a charater
a                      //缓冲功能处于打开状态,这时需要按下回车键才能从终端中获取字符
input is : a
--- buffer function is closed ---
please input a charater
a                      //缓冲功能处于关闭状态,这时不需要按下回车键就能从终端中获取字符
input is : a 

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


时间: 2024-10-03 23:07:09

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

一起talk C栗子吧(第一百七十五回:C语言实例--获取当前终端的行数和列数)

各位看官们,大家好,上一回中咱们说的是关闭终端中缓冲功能的例子,这一回咱们说的例子是:获取当前终端的行数和列数 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍了termios相关的信息,以及termios提供的编程接口,通过这些接口可以操作终端,今天我们再介绍一些操作终端的编程接口,通过这些接口可以获取当前终端的行数和列数,这便是我们今天的主题. int setupterm(char *term, int fd, int *errret); 该函数用来修改当前

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

各位看官们,大家好,上一回中咱们说的是再谈内置宏的例子,这一回咱们说的例子是:关闭终端中的回显功能 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们今天介绍的是关闭终端中的回显功能,首先介绍一下什么是回显功能.当我们在终端中输入字符时终端马上就会显示我们输入的字符,这就是回显功能.我想这样的操作,大家已经司空见惯了,只是不知道它还有一个专业的名字:回显. 回显给我们带来了很多方便,比如我们可以及时看到自己输入到终端中的内容,而且当输入的内容有错误时还可以进行修改.这时有看官说:

一起talk C栗子吧(第一百七十九回:C语言实例--字符和字符串输出函数二)

各位看官们,大家好,上一回中咱们说的是字符和字符串输出函数的例子,这一回咱们继续说该例子.闲 话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中介绍了字符和字符串输出函数的用法,満篇都是理论,古语云:纸上得来终觉浅,绝知此事要躬行.这一回中我们要把这些纸上得来理论应用于实践中,让我们一起动手去实践吧. 接下来,我们将通过具体的代码来说明如何使用字符输出函数,以及使用时的注意事项: int main() { char ch = 'a'; char *str = "hello

一起talk C栗子吧(第一百六十四回:C语言实例--const关键字)

各位看官们,大家好,上一回中咱们说的是三目运算符的例子,这一回咱们说的例子是:const关键字 .闲话休提,言归正转.让我们一起talk C栗子吧! 我们在前面章回中介绍了很多系统编程接口,在这些接口的参数中经常出现const关键字,有看官对此提出了疑问"这些const有什么用处呢?".今天,我将和大家一起来解决该疑问. 在C语言中const是一种修饰符,经常用来修饰变量.使用它修饰以后的变量,就成为常量.常量是不允许被修改的.下我们举个简单的例子来说明const的用法. 1 #inc

一起talk C栗子吧(第一百五十四回:C语言实例--socket通信地址系统调用二)

各位看官们,大家好,上一回中咱们说的是socket通信地址系统调用的例子,这一回咱们继续说该例子.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回介绍的通信地址系统调用有效地解决了数据存储方式的问题,不过,还有一个系统调用也可以解决这种问题,这一回我们将介绍该系统调用:getaddrinfo. 函数原型 该系统调用从其名字上看是用来获取地址的信息,这里的地址主要指套接字通信地址.它获取到的地址信息不需要进行字节序转换,我们可以直接用来进行套接字通信.不过,我们不能只看名字

一起talk C栗子吧(第一百六十二回:C语言实例--套接字知识体系图)

各位看官们,大家好,上一回中咱们说的是套接字通信模型的例子,这一回咱们说的例子是:套接字知识体系图.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们, 我们在前面的章回中介绍了许多关于套接字的内容,有些看官感觉知识比较乱,不断地摇头叹气,而且还在吟诗:剪不断,理还乱,是离愁.不对,是套接字.别有一番滋味在心头.哈哈.这位看官太有才了呀,连古诗也用上了.今天我和大家一起整理下套接字的知识,到时候将会是一番喜悦的滋味在心头. 看官们,我们最开始介绍的是套接字的概念,接着介绍了套接字的属性,

一起talk C栗子吧(第一百三十二回:C语言实例--从内存的角度看进程和线程)

各位看官们,大家好,上一回中咱们说的C程序内存布局的例子,这一回咱们说的例子是:从内存的角度看进程和线程.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们刚刚介绍完C程序的内存布局,我们趁热打铁,从内存的角度来分析一下进程和线程. 不管是进程还是线程,他们都会加载到内存中才能运行,因此他们在内存中的布局和其它C程序的内存布局完全相同.进程和线程的内存布局也分为代码区,数据区,堆区和栈区. 对进程来说,父子进程只共享代码区中的内容,父子进程拥有各自的数据区,堆区和栈区.而且它们只能

一起talk C栗子吧(第一百三十四回:C语言实例--创建线程时的内存细节)

各位看官们,大家好,上一回中咱们说的是"创建进程时的内存细节"的例子,这一回咱们说的例子是:创建线程时的内存细节.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在前面章回中介绍过创建线程的例子,创建线程时使用的函数是pthread_create.今天我们一起说一下使用该函数创建线程时内存的一些细节问题.我们介绍的的重点还是内存布局中的四个分区.这点和前一回中介绍创建进程时内存细节的思路相同. 1.在主线程中使用pthread_create函数可以创建一个新线程,我们叫

一起talk C栗子吧(第一百五十二回:C语言实例--计算机中的大小端)

各位看官们,大家好,上一回中咱们说的是socket通信地址的例子,这一回咱们说的例子是:计算机中的大小端 .闲话休提,言归正转.让我们一起talk C栗子吧! 大小端据说来源于小说<格列佛游记>,书中说:人们在争论打开鸡蛋的方式是从鸡蛋的大端还是小端打开鸡蛋.争论不休,甚至还引起了战争.你说说,不管你从哪一端打开鸡蛋,打开的都是鸡蛋呀,这有什么可以争论的呢?还要通过战争来解决.大家不必关注这个争论,如果真想了解其中的细节,可以看看这部小说.不过在计算机中的大小端就不像小说中争论打开鸡蛋那么简单