linux终端io笔记
简介
终端的两种工作模式:以行为单位的工作模式,以字符数或时间为单位自定义模式
终端判断函数:
- 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笔记的更多相关文章
- linux 标准io笔记
三种缓冲 1.全缓冲:在缓冲区写满时输出到指定的输出端. 比如对磁盘上的文件进行读写通常是全缓冲的. 2.行缓冲:在遇到'\n'时输出到指定的输出端. 比如标准输入和标准输出就是行缓冲, 回车后就会进 ...
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
- Linux实战教学笔记02:计算机系统硬件核心知识
标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 互联网企业常见服务器介绍 1.1 互联网公司服务器品牌 - DELL(大多数公司,常用) - HP - IBM(百度在用) 浪潮 联想 航天联 ...
- Linux终端打印命令使用介绍
常用linux打印命令 日常使用中或shell脚本中linux终端打印命令有echo和printf. echo命令 功能说明:显示文字.语 法:echo [-ne][字符串]或 echo [--he ...
- linux标准io的copy
---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...
- 如何在 Linux 终端中知道你的公有 IP
导读 在本文中我将会介绍在几种在 Linux 终端中查看你的公有 IP 地址的方法.这对普通用户来说并无意义,但 Linux 服务器(无GUI或者作为只能使用基本工具的用户登录时)会很有用.无论如何, ...
- 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 ...
随机推荐
- web前端开发(5)
CSS的一些问题: 一般情况下,尽量使用class选择器 解决点击超链接后hover 样式不出现多次问题:a:visited a:hover 的顺序是问题所在,记住 love hate L(lin ...
- jquery plugins —— datatables 搜索后汇总
网上的例子 http://datatables.club/example/plug-ins/api.html只能对当前页面或所有数据进行汇总,不能对搜索结果数据汇总. 以下是对datatables自带 ...
- 新浪SAE部署django博客
步骤: 第一步:注册新浪SAE账号(即新浪微博),下载TortoiseSVN 第二步:部署代码 使用SAE来部署代码,SAE提供的是PAAS层的云服务,即不是给你一个虚拟主机而是直接上传应用.进入SA ...
- HDU 1598 find the most comfortable road (MST)
find the most comfortable road Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- jQuery两个列表中元素相互交换Demo
效果如图: <html> <head> <meta http-equiv="Content-Type" content="text/html ...
- CF 208E - Blood Cousins dfs序+倍增
208E - Blood Cousins 题目:给出一棵树,问与节点v的第k个祖先相同的节点数有多少个. 分析: 寻找节点v的第k个祖先,这不就是qtree2简化版吗,但是怎么统计该祖先拥有多少个深度 ...
- js使用CSS将图片转换成黑白(灰色、置灰)
详细内容请点击 可能早就知道,像汶川这种糟糕的日子网站全灰在IE下是可以轻松实现的(filter: gray;),不过,当时,其他浏览器是无解的. 不过,时代发展,如今,CSS3的逐步推进,我们也开始 ...
- shell--学习 sed
sed:数据流编辑器 读一行到内存处理一行然后输出一行. 模式空间: sed:默认不编辑源文件 sed [option] ADDRESSCOMMAND file 1.起始行. 结束行 sed ...
- C++类(一)
#include<iostream> #include<string> using namespace std; //找了很久,似乎都是类放在Main方法体上 class Pe ...
- javascript将浮点数转换成整数的三个方法
浮点数转换成整数方法有很多,本例为大家介绍常用的三个方法,如果读者想到其他好用方法,也可以交流一下 Summary 暂时我就想到3个方法而已.如果读者想到其他好用方法,也可以交流一下 parseI ...