简介

终端的两种工作模式:以行为单位的工作模式,以字符数或时间为单位自定义模式

终端判断函数:

  • int isatty(int fd)

终端属性的获取与设置:

  • int tcgetattr(int fd,struct termios *termptr)
  • int tcsetattr(int fd,int opt,const struct termios *termptr),opt选项如下

    TCSANOW:不等数据传输完毕就立即改变属性。

    TCSADRAIN:等待所有数据传输结束才改变属性。

    TCSAFLUSH:等待所有数据传输结束,清空输入输出缓冲区才改变属性。

终端名称的获取:

  • char *ctermid(char *ptr),如果ptr非空,则将终端名称(/dev/tty)写入到此ptr中并返回;若为空,分配空间写入后返回

终端属性结构:struct termios

struct termios{
tcflag_t c_iflag;
tcflag_t c_oflag;
tcflag_t c_cflag;
tcflag_t c_lflag;
cc_t c_cc[NCCS];
};

termios关键字

c_oflag:控制输出格式

  • OPOST:如果屏蔽此关键字,换行后缩进为上一行最后一个字符位置的后一位

c_lflag:本地模式

  • ECHO:回显,如果屏蔽则不显示输入的字符,像输入密码一样
  • ICANON:行模式,屏蔽则变成自定义模式
  • ISIG:使终端产生的信号(ctrl+c/ctrl+z等)起作用,屏蔽则忽略信号

c_iflag:控制输入格式

  • ICRNL:按下回车换行,屏蔽则不换行打印一个^M
  • BRKINT:当在输入行中检测到一个终止状态时,产生一个中断

c_cc:见例2


例子

1.行模式,关闭回显

#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h> #define MAX_PASS_LEN 8 char * getpass(const char *prompt){
static char buf[MAX_PASS_LEN+1];
char *ptr;
struct termios ts,ots;
FILE *fp;
int c; if((fp=fopen(ctermid(NULL),"r+")) == NULL)
return 0;
setbuf(fp,NULL); tcgetattr(fileno(fp),&ts);
ots=ts;
ts.c_lflag &= ~ECHO;
tcsetattr(fileno(fp),TCSAFLUSH,&ts);
fputs(prompt,fp); //ptr < &buf[x] 两个内存地址比较,最多填充到buf[MAX_PASS_LEN-1]
//*ptr=0 在接下来的一位填充0表示结束
ptr=buf;
while((c=getc(fp)) != EOF && c != '\n')
if(ptr < &buf[MAX_PASS_LEN])
*ptr++ = c;
*ptr=0;
putc('\n',fp); tcsetattr(fileno(fp),TCSAFLUSH,&ots);
fclose(fp);
return buf;
} int main(){
char *ptr;
if((ptr=getpass("Enter password:")) == NULL)
perror("getpass word");
printf("passowrd: %s\n",ptr); //先ptr++移到下一位置,接着ptr副本(未移动前的位置)进行*ptr=0
while(*ptr != 0)
*ptr++ =0;
return 0;
}

2.自定义模式

将termios结构中c_lflag字段的ICANON标志关闭就使终端处于非行模式,此时回车换行不作为行结束标识返回

自定义模式下有两种结束标识:

  • c_cc数组中的VMIN变量即c_cc[VMIN]作为最少字符结束标识,字符达到VMIN个就返回,c_cc[VMIN]=0表示不限容量
  • c_cc数组中的VTIME变量即c_cc[VTIME]作为最短时间结束标识,从第一个字符输入开始,经过VTIME时间后就返回,c_cc[VTIME]=0表示不限时间

另外,也可以同时指定上述两个变量,只要有一个变量指定的条件成立就返回

以下为简单自定义模式,字符长度达到10就返回,对SIGINT中断做复位处理

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <termios.h>
#include <signal.h> static struct termios save_termios;
static int ttysavefd=-1; int tty_cbreak(int fd){
struct termios buf;
if(tcgetattr(fd,&save_termios) <0){
perror("tcgetattr error");
return -1;
} buf=save_termios;
buf.c_lflag &= ~ICANON;
buf.c_iflag &= ~ICRNL;
buf.c_cc[VMIN]=10;
buf.c_cc[VTIME]=0; if(tcsetattr(fd,TCSAFLUSH,&buf) <0){
perror("tcsetattr error");
return -1;
}
ttysavefd=fd;
return 0;
} int tty_reset(int fd){
if(tcsetattr(fd,TCSAFLUSH,&save_termios) <0){
return -1;
}
return 0;
} int main(int argc,char *argv[]){
if(signal(SIGINT,sig_catch) == SIG_ERR)
perror("signal error");
if(tty_cbreak(STDIN_FILENO) <0)
perror("tty_cbreak error");
char c[11]={0};
int i;
puts("cbreak mode,terminate with sigint");
while(i=read(STDIN_FILENO,&c,10)){
printf("\n%s\n",c);
}
return 0;
}

linux终端io笔记的更多相关文章

  1. linux 标准io笔记

    三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的. 2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进 ...

  2. storysnail的Linux串口编程笔记

    storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...

  3. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  4. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

  5. Linux实战教学笔记02:计算机系统硬件核心知识

    标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 互联网企业常见服务器介绍 1.1 互联网公司服务器品牌 - DELL(大多数公司,常用) - HP - IBM(百度在用) 浪潮 联想 航天联 ...

  6. Linux终端打印命令使用介绍

    常用linux打印命令 日常使用中或shell脚本中linux终端打印命令有echo和printf.  echo命令 功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--he ...

  7. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  8. 如何在 Linux 终端中知道你的公有 IP

    导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...

  9. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

随机推荐

  1. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列

    题目很简单,给一个队列以及文件的位置,然后一个一个检查,如果第一个是优先级最高的就打印,否则放到队列后面,求所要打印的文件打印需要花费多长时间. 这里我用数组模拟队列实现,考虑到最糟糕的情况,必须把数 ...

  2. 重构7-Rename(method,class,parameter)

    这是我最常用也是最有用的重构之一.我们对方法/类/参数的命名往往不那么合适,以至于误导阅读者对于方法/类/参数功能的理解.这会造成阅读者的主观臆断,甚至引入bug.这个重构看起来简单,但却十分重要. ...

  3. 关于报错:'sharedApplication' is unavailable: not available on iOS (App Extension) - Use view controller based

    最近在看Extension相关知识的时候,自己写了个小demo 发现[UIApplication sharedApplication]这个方法敲不出来了, 总是报错:'sharedApplicatio ...

  4. codeforces 653D D. Delivery Bears(二分+网络流)

    题目链接: D. Delivery Bears time limit per test 2 seconds memory limit per test 256 megabytes input stan ...

  5. wifi密码破解-Linux工具篇-video

    链接: https://pan.baidu.com/s/1eREVoH0 密码: ajk5 博客地址:http://www.cnblogs.com/XieMinQiang/          (长按图 ...

  6. PHP插件技术-插件钩子(hooks)分析

    最近准备做一个开源的个人博客系统,因为在构想中要添加插件功能,所以就研究了一下插件功能的实现方法. 插件的功能按照本人自己的理解就是对已有的程序进行功能方面的添加以及改进,插件要与程序所提供的接口进行 ...

  7. AjaxPro.2使用小结

    这是我最近没事的时候研究的东东,使用AjaxPro.2.dll,从前台调用后台Ajax方法,希望对各位亲有帮助哦.. 1.首先将AjaxPro.2.dll从网上下载下来,打开VS项目,点击项目,右键- ...

  8. Part 6 AngularJS ng repeat directive

    ng-repeat is similar to foreach loop in C#. Let us understand this with an example. Here is what we ...

  9. php 图片调整大小 封装类【转载】

    <?php class ImageResize { private $image; private $img_des; private $image_type; private $permiss ...

  10. jQuer中 height scrollTop

    jQuery(window).height()代表了当前可见区域的大小,而jQuery(document).height()则代表了整个文档的高度,可视具体情况使用. 注意当浏览器窗口大小改变时(如最 ...