终端I/O之特殊输入字符
POSIX.1定义了11个在输入时作特殊处理的字符。实现定义了另外一些特殊字符。表18-6摘要列出了这些特殊字符。
表18-6 终端特殊输入字符

在POSIX.1的11个特殊字符中,可将其中9个更改为几乎任何值。不能更改的两个特殊字符是换行符和回车符(\n和\r),有些实现也不允许更改STOP和START字符。为了进行修改,只要更改termios结构中c_cc数组的相应项。该数组中的元素都用名字作为下标进行引用,每个名字都以字母V开头。
POSIX.1允许禁用这些字符。若将c_cc数组中的某项设置为_POSIX_VDISABLE的值,则禁用相应的特殊字符。
实例
在详细说明各特殊字符之前,先看一个更改特殊字符的程序。程序清单18-1禁用中断字符,并将文件结束符设置为Ctrl+B。
程序清单18-1 禁用中断字符和更改文件结束字符
#include "apue.h"
#include <termios.h>
int
main(void)
{
struct termios term;
long vdisable;
if(iastty(STDIN_FILENO) == 0)
err_quit("standard input is not a terminal device");
if((vdisable = fpathconf(STDIN_FILENO, _PC_VDISABLE)) < 0)
err_quit("fpathconf error or _POSIX_VDISABLE not in effect");
if(tcgetattr(STDIN_FILENO, &term) < 0) /* fetch tty state */
err_sys("tcgetattr error");
term.c_cc[VINTR] = vdisable; /* disable INTR character */
term.c_cc[VEOF] = 2; /* EOF is Control-B */
if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &term) < 0)
err_sys("tcsetattr error");
exit(0);
}
对此程序要说明以下几点:
- 仅当标准输入是终端设备时才修改终端特殊字符。调用isatty对此进行检测。
- 用fpathconf取_POSIX_VDISABLE值。
- 函数tcgetattr从内核取termios结构。在修改了此结构后,调用tcsetattr函数设置属性,这样就可以进行我们所希望的修改,而其他属性则保持不变。
- 禁用中断键与忽略中断信号是不同的。程序清单18-1所做的是禁止使用使终端驱动程序产生SIGINT信号的特殊字符。但仍可使用kill函数向进程发送该信号。
下面较详细地说明各个特殊字符。我们称这些字符为特殊输入字符,但是其中STOP和START(Ctrl+S和Ctrl+Q)两个字符在输出时也对它们进行特殊处理。注意,这些字符中的大多数在被终端驱动程序识别并进行特殊处理后都被丢弃,并不将它们传送给执行读终端操作的进程。例外的字符是换行符(NL,EOL,EOL2)和回车符(CR)。
CR 回车符。不能更改此字符。以规范模式进行输入时识别此字符。当设置了ICANON(规范模式)和ICRNL(将CR映射为NL)并且没有设置IGNCR(忽略CR)时,将CR转换成NL,并产生于NL符相同的作用。此字符返回给读进程(多半是转换成NL后)。
DISCARD 删除符。在扩充模式下(IEXTEN),在输入中识别此字符。在输入另一个DISCARD符之前或删除条件被清除之前(见FLUSHO选项),此字符使后续输出都被删除。在处理后此字符即被删除,不送向读进程。
DSUSP 延迟-挂起作业控制字符(delayed-suspend job-control character)。在扩充方式下,若支持作业控制并且ISIG标志被设置,则在输入中识别此字符。与SUSP字符的相同处是:延迟-挂起字符产生SIGTSTP信号,它被送至前台进程组中的所有进程。但是延迟-挂起字符产生信号的时间并不是在键入此字符时,而是在一个进程读控制终端读到此字符时。在处理后,此字符即被删除,不送向读进程。
EOF 文件结束符。以规范模式(ICANON)进行输入时识别此字符。当键入此字符时,等待被读的所有字节都立即传送给读进程。如果没有字节等待读,则返回0。在行首输入一个EOF符是向程序指示文件结束的正常方式。在以规范模式处理后,此字符即被删除,不送向读进程。
EOL 附加的行定界符,与NL作用相同。以规范模式(ICANON)进行输入时识别此字符,并将此字符返回给读进程。但通常不使用此字符。
EOL2 另一个行定界符,与NL作用相同。对此字符的处理方式与EOL字符相同。
ERASE 擦除字符(退格)。以规范模式(ICANON)输入时识别此字符。它擦除行中的前一个字符,但不会超越行首字符擦除上一行中的字符。在以规范模式处理后此字符即被删除,不送向读进程。
ERASE2 另一个擦除字符(退格)。对此字符的处理与ERASE完全相同。
INTR 中断字符。若设置了ISIG标志,则在输入中识别此字符。它产生SIGINT信号,该信号被送至前台进程组中的所有进程。在处理后,此字符即被删除,不送向读进程。
KILL kill(杀死)字符。(名字"杀死"在这里又一次被误用,会议kill函数,它将一个信号发送给进程。此字符应被称为行擦除符,它与信号毫无关系。)以规范模式(ICANON)输入时识别此字符。它擦除一整行。在处理后,此字符即被删除,不送向读进程。
LNEXT "字面上的下一个"字符(literal-next character)。以扩充方式(IEXTEN)输入时识别此字符,它使下一个字符的任何特殊含义都被忽略。使用这一字符可向程序键入任何字符。在处理后,LNEXT字符即被删除,但输入的下一个字符(即使是特殊字符)则被传送给读进程。
NL 新行字符,它也被称为行定界符。不能更改此字符。以规范模式(ICANON)输入时识别此字符。此字符返回给读进程。
QUIT 推出字符。若设置了ISIG标志,则在输入中识别此字符。它产生SIGQUIT信号,该信号又被送至前台进程组中的所有进程。在处理后,此字符即被删除,不送向读进程。
REPRINT 再打印字符。以扩充规范模式(设置了IEXTEN和ICANON标志)进行输入时识别此字符。它使所有未读的输入被输出(再回显)。在处理后,此字符即被删除,不送向读进程。
START 启动字符。若设置了IXON标志则在输入中识别此字符;若设置IXOFF标志则作为输出自动产生此字符。在IXON已设置时接收到的START字符使停止的输出(由以前输入的STOP字符造成的)重新启动。在此情形下,此字符处理后即被删除,不送向读进程。在IXOFF标志被设置时,若输入不会使输入缓冲区溢出,则终端驱动程序自动地产生一START字符以恢复以前被停止的输入。
STATUS BSD的状态-请求字符。以扩充规范模式(设置IEXTEN和ICANON标志)进行输入时识别此字符。它产生SIGINFO信号,该信号又被送至前台进程组中的所有进程。另外,如果没有设置NOKERNINFO标志,则有关前台进程组的状态信息也显示在终端上。在处理后,此字符即被删除,不送向读进程。
STOP 停止字符。若设置了IXON标志,则在输入中识别此字符;若IXOFF标志已设置则作为输出自动产生此字符。在IXON已设置时接受到STOP字符则停止输出。在此情形下,处理后删除此字符,不送向读进程。当输入一个START字符后,停止的输出重新启动。在IXOFF设置时,终端驱动程序自动地产生一个STOP字符以防止输入缓冲区溢出。
SUSP 挂起作业控制字符。若支持作业控制并且ISIG标志已设置,则在输入中识别此字符。它产生SIGTSTP信号,该信号又被送至前台进程组的所有进程。在处理后,此字符即被删除,不送向读进程。
WERASE 字擦除字符。以扩充规范模式(设置IEXTEN和ICANON标志)进行输入时识别此字符。它擦除前一个字。首先,它向后跳过任一空白字符(空格或制表符),然后再向后越过前一个记号(token),使光标处在前一个记号的第一个字符位置上。通常,前一个记号在碰到一个空白字符时即终止。但是,可用设置ALTWERASE标志来改变这一点。此标志使前一个记号在碰到第一个非字母、数字符时即终止。在处理后,此字符即被删除,不送向读进程。
需要为终端设备定义的另一个"字符"是BREAK。BREAK实际上并不是一个字符,而是在异步串行数据传送时发生的一个条件。依赖于串行接口,可以有多种方式通知设备驱动程序发生了BREAK条件。
对于异步串行数据传送,BREAK是一个0值的位序列,其持续时间长于要求发送一个字节的时间。整个0值位序列被视为是一个BREAK。
终端I/O之特殊输入字符的更多相关文章
- EditText限制输入字符类型的几种方式
最近的项目上需要限制EditText输入字符的类型,就把可以实现这个功能的方法整理了一下: 1.第一种方式是通过EditText的inputType来实现,可以通过xml或者Java文件来设置.假如我 ...
- BufferedReader,缓冲输入字符流
1. /** * 输入字符流: * --------|Reader 所有输入字符流的基类.抽象类 * -----------|FileReader 读取文件字符串的输入字符流. * --------- ...
- iOS 限制UITextField输入字符
开篇 之前做过一个即时通信的项目,需要限制输入框文本的字符个数,当时从网络上搜寻了几个方法,解决了需求,但是网络上的解决办法不是很全面:今天又遇到一个限制搜索框UISearchBar输入字符个数的问题 ...
- textarea中限制输入字符长度
要在textarea中限制输入字符的长度,比如在twitter中要限制字符为140个,可实现的方法有: 1. <textarea name="A" cols="45 ...
- Android EditText的输入监听,输入字符的动态获取
http://itindex.net/detail/38974-android-edittext-%E7%9B%91%E5%90%AC 有时候我们可能会用到时时的监听EditText输入字符的时时监听 ...
- while死循环问题-输入字符就会死循环
问题: 是否会遇到这样的问题,在while循环中 sanf("%d",&a);如果输入的不是数字,是字符就会进入死循环. 解决方案:都是缓冲区惹的祸,输入字符后,字符会一直 ...
- 【转】android 中如何限制 EditText 最大输入字符数
原文网址:http://blog.csdn.net/fulinwsuafcie/article/details/7437768 方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:andr ...
- android 中如何限制 EditText 最大输入字符数
方法一: 在 xml 文件中设置文本编辑框属性作字符数限制 如:android:maxLength="10" 即限制最大输入字符个数为10 方法二: 在代码中使用InputFilt ...
- (19)IO流之字符流FileReader和FileWriter,缓冲字符流---缓冲输入字符流BufferedReader和缓冲输出字符流BufferedWriter
字符流,读取的文件是字符的时候,有两个基类一个是Reader,一个是Writer这有点拟人的感觉,人直接看懂的是文字 字符流 字节流:读取的是文件中的二进制字节流并不会帮你转换成看的懂得字符 字符流: ...
随机推荐
- hadoop2.5.2学习及实践笔记(二)—— 编译源代码及导入源码至eclipse
生产环境中hadoop一般会选择64位版本,官方下载的hadoop安装包中的native库是32位的,因此运行64位版本时,需要自己编译64位的native库,并替换掉自带native库. 源码包下的 ...
- Windows Azure 虚拟网络配置(Point to Site)
说明:本文以Azure国际版为例,中国版在网络位置会存在一定差异. 1. 场景 虚拟网络为我们提供了在Windows Azure云计算环境上构建网络定义的能力,通过虚拟网络,我们可以方便地将Windo ...
- var隐式类型
var dogName = "ruiky"; 1.[编译器]会在编译时自动根据值的类型推断这个变量的类型: 2.变量类型不可更改:因为声明的时候已经确定类型了. 3.可 ...
- 第三百五十九天 how can I 坚持
在家待了一天,鼓捣了下linux,总算能连上网了,懂得还是少啊. 晚上去华北电力大学跑了会步,十圈,还挺有成就感呢,就是没带手环,哎. 以后学习一定要记笔记,上了这么多年学,都 没学会怎么记笔记,也是 ...
- 制作Andriod程序的数字签名需要使用JDK
原文地址:制作Andriod程序的数字签名需要使用JDK作者:黄金大劫案88 制作Andriod程序的数字签名需要使用JDK,先确认本机是否安装了JDK,在JDK目录下有一个KEYTOOL工具,这个 ...
- sql数据库delete删除后怎么恢复,这是网上找的答案。。希望大神验证指教一下
使用Log Explorer查看和恢复数据 Log Explorer 4.1.可用于SQL Server2005的日志查看工具 下载地址: http://download.csdn.net/sourc ...
- tableviewcell 系统工具删除:左滑删除,选中多个删除
在编辑tableview的时候,我们有时候会需要编辑对一些cell进行删除(增加),在这个时候,我们最好用系统的方法来进行增删的操作 // // text1Controller.m // text / ...
- Linux下 如何正确配置 Nginx + PHP
假设我们用PHP实现了一个前端控制器,或者直白点说就是统一入口:把PHP请求都发送到同一个文件上,然后在此文件里通过解析「REQUEST_URI」实现路由. 一般这样配置 此时很多教程会教大家这样配置 ...
- 有关获取session属性时报nullPointException(空指针异常)的解决方案
一般我们在从session中获取数据时,需要先进行赋值,也就是必须先进行session.setAttribute(String,Object)方法进行赋值,然后我们才能从session中获取内容,但是 ...
- Android ndk下用AssetManager读取assets的资源
转自:http://www.cppblog.com/johndragon/archive/2012/12/28/196754.html 在使用 cocos2dx 在 Android 上进行游戏开发时, ...