- 浏览: 142366 次
文章分类
最新评论
终端支持下表所示的特殊输入字符。
为了更改,只需要修改 termios 结构(见终端 I/O 综述一节)中 c_cc 数组的相应项,该数组中的元素都用上表中第 3 列中的名字作为下标进行引用。若将 c_cc 数组中的某项设置为 _POSIX_VDISABLE 值,则禁止使用相应的特殊字符。
下面是一个更改特殊字符的示例程序,它会禁用中断字符,并将文件结束符设置为 Ctrl+B。
对此程序要说明以下几点:
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。
为了更改,只需要修改 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。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1252在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1548伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 799多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 949终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 569尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 943虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 709tcgetattr 和 tcsetattr ... -
终端 I/O 综述
2018-05-10 07:56 438终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 579在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 946在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 616在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 497消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 485有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 421FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 389管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 889readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 455POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 615记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 439UNIX 系统中,守护进程遵循下列通用惯例。 ... -
守护进程编写规则与出错记录
2017-12-26 01:53 454在编写守护进程程 ...
相关推荐
在"else if 结构应用,分析终端输入字符"的主题中,我们可以假设这是一个关于如何根据用户在终端(命令行)输入的字符来执行不同操作的教程或项目。例如,用户可能会输入数字、字母、特殊字符等,而我们的程序需要...
在Linux系统中,字符终端界面的编程一直是一个非常重要的领域,尤其是在企业级和高端应用中。Linux字符终端界面编程之所以受到重视,是因为它能够为用户和程序提供一个交互式的操作环境,尤其是在图形用户界面不够...
开发者需要熟悉这些函数的使用,以及如何处理终端的特殊字符,例如方向键,以实现流畅的用户交互。 五、游戏逻辑实现 2048游戏的核心逻辑包括合并数字、生成新数字、检查游戏状态(赢或输)等。在字符版中,这些...
### Linux Shell 特殊字符和控制字符详解 #### 一、Shell特殊字符 Shell特殊字符在Linux Shell编程中起着非常重要的作用,它们用于控制Shell的行为、格式化输出以及进行各种复杂的操作。以下是对给定内容中提到的...
1. **输入处理**:首先,程序从终端接收用户输入的一段英文字符。这段文本中的字符将会被用于后续的编码过程。 2. **字符频率统计**:接着,程序统计这段文本中每个字符的出现频率。这一过程对于构建赫夫曼树至关...
- 字符集的多样性:不同的字符集能产生截然不同的视觉效果,用户可以选择常见的字母数字,也可以尝试使用特殊符号或者自定义图案。 5. **上传与下载**: - 方便的操作:用户可以直接通过工具上传自己的图片或GIF...
字符串中的转义字符是一个特殊概念,它允许我们在字符串中插入特殊字符或表示无法直接输入的字符。转义字符是通过在字符前加上反斜杠 `\` 来实现的。在Python中,转义字符主要用于以下几种情况: 1. **续行符**:当...
代码中的tty.setraw(fd)函数调用是使终端进入原始模式,原始模式下,读取操作不会处理输入字符的特殊含义,不会将多字符输入序列(如Ctrl+C)转换为单个信号,也不会进行行编辑。这种模式下的输入是“原始的”,即...
2. 特殊字符输入:支持输入生僻字、繁体字以及各种专业符号。 七、设备兼容性 1. 安卓系统:Android设备通常内置多种中文输入法,用户可根据需求下载安装。 2. iOS系统:苹果设备提供自带的拼音输入法,同时支持第...
它提升了用户体验,尤其是对于不习惯触屏操作或有特殊输入需求的用户。 总的来说,“c# WPF 自助终端触控屏拼音手写屏幕键盘源码”是C#和WPF技术在人机交互领域的一个典型应用实例,展示了如何利用高级编程语言和...
4. **触屏手势识别**:讨论如何识别用户在触摸屏上的滑动、点击等手势,用于输入文字或者特殊字符。 5. **用户个性化**:描述如何学习用户的输入习惯,提供个性化的输入建议和设置。 6. **性能优化**:讲述如何...
手势输入则允许用户通过在键盘区域画出特定的轨迹来输入字符,比如在字母上方滑动可以输入对应的字母。这种方法减少了手指在屏幕上的精确点击,提高了输入的流畅性。 滑动输入,又称为滑动拼写(Swype输入法),...
转义字符在C语言中扮演着特殊的角色,它们允许程序员在字符串或字符常量中插入具有特定意义的字符,这些字符通常不能直接输入或有特殊的语法含义。下面我们将详细探讨C语言中的常用转义字符及其功能。 ### 1. 空...
在没有图形用户界面(GUI)的情况下,开发者使用字符来构建游戏界面,通过控制台输出各种形状的方块,使玩家可以通过键盘输入进行旋转、移动和消除。这种技术被称为“ASCII艺术”,在早期计算机和文本终端中非常常见...
在默认情况下,当用户在Linux终端中输入字符时,这些字符会立即显示在屏幕上。但是,在某些情况下,我们希望隐藏用户的输入,这通常用于密码输入等安全性较高的场景。为了实现这一点,我们需要利用`termios`库中的...
3. **编程语言**:几乎所有编程语言都支持ACSII字符集,用于字符串处理、输入输出等功能。 4. **数据库存储**:数据库系统通常使用ACSII字符来存储文本数据,确保兼容性和可读性。 #### 六、总结 ACSII字符对照表是...
7. **字符画**:在终端上画出简单的图形,如蛇和食物,可以使用ASCII码中的特殊字符。例如,用'*'表示食物,用'#'表示蛇的身体。 8. **游戏逻辑**:游戏的逻辑包括计算蛇的新位置、检查碰撞、更新分数等。这部分...
此快捷键通常用于输入一些特殊符号或控制字符。 **Esc+T**: 交换光标前后两个字符的位置。类似于Ctrl+T,但可能在某些特定的环境中会有不同的行为。 **Ctrl+C**: 取消当前命令。这是一个非常重要的快捷键,当命令...