`

终端特殊输入字符

阅读更多
    终端支持下表所示的特殊输入字符。


    为了更改,只需要修改 termios 结构(见终端 I/O 综述一节)中 c_cc 数组的相应项,该数组中的元素都用上表中第 3 列中的名字作为下标进行引用。若将 c_cc 数组中的某项设置为 _POSIX_VDISABLE 值,则禁止使用相应的特殊字符。
    下面是一个更改特殊字符的示例程序,它会禁用中断字符,并将文件结束符设置为 Ctrl+B。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>

int main(void){
	if(isatty(STDIN_FILENO) == 0){
		printf("standard input is not a terminal device\n");
		exit(1);
	}
	long vdisable = fpathconf(STDIN_FILENO, _PC_VDISABLE);
	if(vdisable < 0){
		printf("fpathconf error or _POSIX_VDISABLE not in effect\n");
		exit(1);
	}
	struct termios	term;
	if(tcgetattr(STDIN_FILENO, &term) < 0){		// fetch tty state
		printf("tcgetattr error\n");
		exit(1);
	}
	term.c_cc[VINTR] = vdisable;		// disable INTR character
	term.c_cc[VEOF]	= 2;			// EOF now is Control-B
	if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &term) < 0){
		printf("tcsetattr error\n");
		exit(1);
	}
	exit(0);
}

    对此程序要说明以下几点:
    1、仅当标准输入是终端设备时才能修改其终端特殊字符。使用 isatty 函数可对此进行检测。
    2、使用了 fpathconf 函数获取 _POSIX_VDISABLE 的值,以免在系统不支持时直接赋值该值报错。
    3、先后分别使用 gcgetattr 和 tcsetattr 函数来确保只修改希望修改的属性,而其他属性保持不变。
    4、禁用中断键与忽略中断信号是不同的。禁用中断键只是禁用了使终端驱动程序产生 SIGINT 信号的特殊字符,但仍可使用 kill 函数来将该信号发送至进程。
    下面将详细说明各特殊输入字符,但要注意其中 STOP 和 START(Ctrl+S 和 Ctrl+Q)在输出时也要进行特殊处理。另外,其中的大多数字符在被终端驱动程序识别并进行特殊处理后就会被丢弃,并不将它们返回给执行读终端操作的进程。返回给读进程的例外字符是换行符(NL、EOL、EOL2)和回车符(CR)。
    * CR:回车符。以规范模式进行输入时识别此字符。在已设置 ICANON(规范模式) 和 ICRNL(将 CR 映射为 NL)但并未设置 IGNCR(忽略 CR)时,CR 字符会被转换成 NL。此字符会返回给读进程(很可能是在转换为 NL 后)。
    * DISCARD:丢弃符。在扩充模式(IEXTEN)下进行输入时识别。在输入另一个 DISCARD 之前或在丢弃条件被清除之前(见 FLUSHO 选项),此字符使后续输出都被丢弃。
    * DSUSP:延迟挂起作业控制符(delayed-suspend job-control character)。在扩充模式(IEXTEN)下,若支持作业控制,且已设置 ISIG 标志,则在输入时识别此字符。它与 SUSP 字符的相同之处是:产生 SIGTSTP 信号,并将该信号发送至前台进程组中的所有进程。但是,信号产生的时间并不是在键入延迟挂起字符之时,而是在某个进程从控制终端读到此字符时才产生。
    * EOF:文件结束符。以规范模式(ICANON)进行输入时识别此字符。当键入此字符时,等待被读的所有字节都被立即传送给读进程。如果没有字节等待读就返回 0。
    * EOL/EOL2:附加的行定界符。作用同 NL。
    * ERASE/ERASE2:向前擦除字符(退格)。以规范模式(ICANON)输入时识别此字符。
    * INTR:中断字符。若已设置 ISIG 标志,则在输入中识别此字符。它将产生的 SIGINT 信号发送至前台进程组中的所有进程。
    * KILL:行擦除符。以规范模式(ICANON)输入时识别。它擦除一整行。
    * LNEXT:下一个字符的字面值(literal-next character)。以扩充模式(IEXTEN)输入时识别。它使下一个字符的任何特殊含义都被忽略。使用该字符可向程序键入任何字符。它在处理后即被丢弃,但输入的下一个字符会被传送给读进程。
    * NL:换行符,也称为行定界符。以规范模式(ICANON)输入时识别。
    * QUIT:退出字符。若已设置 ISIG 标志,则在输入中识别此字符。它将产生的 SIGQUIT 信号发送至前台进程组中的所有进程。它与 INTR 的区别是:它不仅按默认规则终止进程,而且还产生一个 core 文件。
    * REPRINT:再打印字符。以扩充规范模式(设置了 IEXTEN 和 ICANON 标志)进行输入时识别。它使所有未读的输入被输出(再回显)。
    * START:启动字符。若已设置 IXON 标志,则在输入中识别;若已设置 IXOFF 标志,则自动产生此字符作为输出。已设置 IXON 时,接收到的 START 使停止的输出(由以前输入的 STOP 字符造成)重新启动。此种情形下,此字符在处理后即被丢弃。已设置 IXOFF 时,若新的输入不会使输入缓冲区溢出,则终端驱动程序自动产生一个 START 字符来恢复以前被停止的输入。
    * STATUS:BSD 的状态请求字符。以扩充规范模式(设置了 IEXTEN 和 ICANON)进行输入时识别。它将产生的 SIGINFO 信号发送至前台进程组中的所有进程。另外,如果没有设置 NOKERNINFO 标志,则有关前台进程组的状态信息也显示在终端上。
    * STOP:停止字符。若已设置 IXON 标志,则在输入中识别;若已设置 IXOFF 标志,则自动产生此字符作为输出。已设置 IXON 时,接收到 STOP 会停止输出。此种情形下,此字符在处理后即被丢弃。已设置 IXOFF 时,终端驱动程序自动产生一个 STOP 字符以防止输入缓冲区溢出。
    * SUSP:挂起作业控制字符。若支持作业控制并且已设置 ISIG 标志,则在输入中识别。它将产生的 SIGTSTP 信号发送至前台进程组中所有进程。
    * WERASE:字擦除字符。以扩充规范模式(设置了 IEXTEN 和 ICANON)进行输入时识别。它使前一个字被擦除。通常,前一个记号在碰到一个空白符时即终止,但可通过设置 ALTWERASE 标志(见终端 I/O 综述中的 c_lflag 标志表)来使前一个记号在碰到第一个非字母、非数字字符时即终止。
    另外,需要为终端设备定义的另一个“字符”是 BREAK。BREAK 实际上并不是一个字符,而是在异步串行数据传送时发生的一个条件。根据串行接口的不同,可以有多种方式通知设备驱动程序发生了 BREAK 条件。对于异步串行数据传送,BREAK 是一个 0 值的位序列,其持续时间长于要求发送一个字节的时间。整个 0 值位序列被视为是一个 BREAK。可以使用函数 tcsendbreak 来发送一个 BREAK。
  • 大小: 35.1 KB
  • 大小: 23.4 KB
分享到:
评论

相关推荐

    else if 结构应用,分析终端输入字符。

    在"else if 结构应用,分析终端输入字符"的主题中,我们可以假设这是一个关于如何根据用户在终端(命令行)输入的字符来执行不同操作的教程或项目。例如,用户可能会输入数字、字母、特殊字符等,而我们的程序需要...

    2048Linux字符版.rar

    开发者需要熟悉这些函数的使用,以及如何处理终端的特殊字符,例如方向键,以实现流畅的用户交互。 五、游戏逻辑实现 2048游戏的核心逻辑包括合并数字、生成新数字、检查游戏状态(赢或输)等。在字符版中,这些...

    Linux-Shell特殊字符和控制字符大全

    ### Linux Shell 特殊字符和控制字符详解 #### 一、Shell特殊字符 Shell特殊字符在Linux Shell编程中起着非常重要的作用,它们用于控制Shell的行为、格式化输出以及进行各种复杂的操作。以下是对给定内容中提到的...

    对任意输入的一段英文,为每个字符编制其相应的赫夫曼编码;并利用该编码为任意输入的0、1序列进行解码.

    1. **输入处理**:首先,程序从终端接收用户输入的一段英文字符。这段文本中的字符将会被用于后续的编码过程。 2. **字符频率统计**:接着,程序统计这段文本中每个字符的出现频率。这一过程对于构建赫夫曼树至关...

    图片转字符画,gif转字符画,支持彩色字符画,支持清晰度调整,支持自定义字符画字符输入,可以直接进行上传和下载字符画。

    - 字符集的多样性:不同的字符集能产生截然不同的视觉效果,用户可以选择常见的字母数字,也可以尝试使用特殊符号或者自定义图案。 5. **上传与下载**: - 方便的操作:用户可以直接通过工具上传自己的图片或GIF...

    测量程序编制 - python 12数据类型:String(字符串)-转义字符.pptx

    字符串中的转义字符是一个特殊概念,它允许我们在字符串中插入特殊字符或表示无法直接输入的字符。转义字符是通过在字符前加上反斜杠 `\` 来实现的。在Python中,转义字符主要用于以下几种情况: 1. **续行符**:当...

    python监控键盘输入实例代码

    代码中的tty.setraw(fd)函数调用是使终端进入原始模式,原始模式下,读取操作不会处理输入字符的特殊含义,不会将多字符输入序列(如Ctrl+C)转换为单个信号,也不会进行行编辑。这种模式下的输入是“原始的”,即...

    电信设备-使用移动终端输入中文的方法.zip

    2. 特殊字符输入:支持输入生僻字、繁体字以及各种专业符号。 七、设备兼容性 1. 安卓系统:Android设备通常内置多种中文输入法,用户可根据需求下载安装。 2. iOS系统:苹果设备提供自带的拼音输入法,同时支持第...

    c# WPF 自助终端触控屏拼音手写屏幕键盘源码

    它提升了用户体验,尤其是对于不习惯触屏操作或有特殊输入需求的用户。 总的来说,“c# WPF 自助终端触控屏拼音手写屏幕键盘源码”是C#和WPF技术在人机交互领域的一个典型应用实例,展示了如何利用高级编程语言和...

    电信设备-一种输入法输出字符的处理方法及移动终端.zip

    4. **触屏手势识别**:讨论如何识别用户在触摸屏上的滑动、点击等手势,用于输入文字或者特殊字符。 5. **用户个性化**:描述如何学习用户的输入习惯,提供个性化的输入建议和设置。 6. **性能优化**:讲述如何...

    电信设备-一种虚拟键盘输入方法及移动终端.zip

    手势输入则允许用户通过在键盘区域画出特定的轨迹来输入字符,比如在字母上方滑动可以输入对应的字母。这种方法减少了手指在屏幕上的精确点击,提高了输入的流畅性。 滑动输入,又称为滑动拼写(Swype输入法),...

    C语言常用转义字符表

    转义字符在C语言中扮演着特殊的角色,它们允许程序员在字符串或字符常量中插入具有特定意义的字符,这些字符通常不能直接输入或有特殊的语法含义。下面我们将详细探讨C语言中的常用转义字符及其功能。 ### 1. 空...

    C++字符俄罗斯方块

    在没有图形用户界面(GUI)的情况下,开发者使用字符来构建游戏界面,通过控制台输出各种形状的方块,使玩家可以通过键盘输入进行旋转、移动和消除。这种技术被称为“ASCII艺术”,在早期计算机和文本终端中非常常见...

    linux下实现输入回显屏蔽以及实现输入不需要回车.txt

    在默认情况下,当用户在Linux终端中输入字符时,这些字符会立即显示在屏幕上。但是,在某些情况下,我们希望隐藏用户的输入,这通常用于密码输入等安全性较高的场景。为了实现这一点,我们需要利用`termios`库中的...

    ACSII 字符对照表 打印版

    3. **编程语言**:几乎所有编程语言都支持ACSII字符集,用于字符串处理、输入输出等功能。 4. **数据库存储**:数据库系统通常使用ACSII字符来存储文本数据,确保兼容性和可读性。 #### 六、总结 ACSII字符对照表是...

    字符游戏-贪吃蛇

    7. **字符画**:在终端上画出简单的图形,如蛇和食物,可以使用ASCII码中的特殊字符。例如,用'*'表示食物,用'#'表示蛇的身体。 8. **游戏逻辑**:游戏的逻辑包括计算蛇的新位置、检查碰撞、更新分数等。这部分...

    Linux终端快捷键

    此快捷键通常用于输入一些特殊符号或控制字符。 **Esc+T**: 交换光标前后两个字符的位置。类似于Ctrl+T,但可能在某些特定的环境中会有不同的行为。 **Ctrl+C**: 取消当前命令。这是一个非常重要的快捷键,当命令...

    键盘终端处理程序的各项功能.docx

    - 回显是用户输入字符后立即在屏幕上显示的行为。软件实现的回显更为灵活,可以按需开启或关闭,如在输入密码时不显示,也可以进行字符大小写的转换。回显时需要注意字符的位置,避免超出屏幕行宽。 4. **屏幕编辑...

Global site tag (gtag.js) - Google Analytics