以下是 ASCII 格式的控制字符(以黄色突出显示):
要将这些控制字符之一发送到线路纪律从终端,我们输入Ctrl+someChar
,例如要发送0x03
控制字符,我们输入Ctrl+C
。
现在,Linux 是否支持图像中显示的所有这些控制字符,还是仅支持这些控制字符的子集?
编辑:
我所说的“支持”是指如果它们可以发送到线路纪律从航站楼。但我刚刚发现以下内容文档,它表示仅支持 14 个控制字符(而不是 ASCII 表中的 33 个),所以我想我的问题的答案是不,并非 ASCII 表中的所有控制字符都受支持。
答案1
是的。
终端可以通过串行设备(如果它是真正的终端)将其喜欢的任何字符(控制或其他字符)发送到线路规程,然后再发送到应用程序。
如果线路纪律处于非规范输入模式,正如我在回答你的“防止线路纪律处理控制字符”问题,那么应用程序可以读取终端发送的字符。如果线路规则处于规范输入模式然后编辑字符,例如单词或行擦除字符将由行纪律制定。
现代 shell(自 20 世纪 80 年代以来)使用非规范输入模式,并自行执行所有编辑功能,对终端生成的原始字符流进行操作。当这些 shell 调用其他程序时,它们会将终端置于规范输入模式,这就是为什么您在运行 C 程序时会看到行规则的编辑功能生效。
我的意思是“支持”,如果它们可以从终端发送到线路纪律。但我刚刚找到了[Linux control_codes(4)手册页],上面说只支持14个控制字符
您将输入和输出混淆了。手册页告诉您内核中的内置终端仿真器如何解释控制代码发送至终端不会告诉您有关控制代码的信息收到自终点站。
ASCII 中的控制字符
ASCII 是一个 7 位字符集。同样从 20 世纪 80 年代开始,实际上早在 1980 年代之前,我们就已经有了 8 位字符集的想法。 8 位字符集有第二组控制代码,即“C1”控制代码。
将串行设备配置为线路上有 8 个数据位(如果这是真实终端),并且线路规则支持 8 位字符,并且再次在非规范模式下,可以发送整个 8 位字符中的每个字符设置 - 无论是 C0 控制代码、C1 控制代码还是其他 - 从终端到应用程序。
答案2
您似乎对 Linux 的各个级别和构建块感到困惑。
这线路纪律仅解释 Ctrl-C(SIGINT
向前台组中的所有进程发送信号),并且如果启用,则解释软件流控制字符 Ctrl-S 和 Ctrl-Q。
各种各样的终端解释各种控制序列,例如xterm主要基于VT100解释控制序列,或安慰您找到的序列。
其他应用可以解释其他控制序列;例如,模拟大型机处理的遗留应用程序可以解释FS
、GS
和分隔符RS
(US
Linux 上没有其他人使用它们,因为它不是面向记录的)。
没有中心点以某种方式说“这个控制序列总是意味着这个特定的事情”。也不需要以某种方式解释所有 ASCII 控制字符。
编辑
生产线纪律没有任何关系行编辑。这线线路规则中的“线路连接”是指外部设备(终端)与计算机连接的电气连接(例如电话线)。线路规程的工作是控制该连接上的通信,这就是它解释软件流控制字符的原因。内核中还有其他行规则进行不同类型的控制。
行编辑完全取决于您正在运行的应用程序。例如,bash
有一个行编辑器,它以模仿 emacs 或 vi 的方式解释击键。这就是 Ctrl-W(在 emacs 模式下)删除单词的原因。而这个作业有没有什么完全与 ASCII 相关。
再说一遍:Linux 系统由许多部分组成,每个部分都以自己喜欢的方式解释控制字符。
答案3
这线路纪律与终端有关伪终端。阅读tty 揭秘首先页面。然后阅读术语(3)。一个终端可能有几种状态,参见stty(1)。在某些状态下,它不处理控制字符。在其他州,它不会处理所有这些(例如;DC3
可能没有特定的处理)。
终端是相当复杂的东西(而且它们是遗留的东西,因为在现实世界中物理终端如那个VT100不再使用,只有 2017 年你才会在博物馆里找到它们,只有虚拟终端如今已在 Linux 中实际使用)。我建议使用一些库,例如恩诅咒如果你想编写一些代码基于文本的用户界面(或者类似的东西阅读线如果你想要一个基于行的)。也可以看看术语帽并阅读有关ANSI 转义码。顺便说一句,大多数交互式 shell(如bash
或zsh
...)和终端应用程序(例如vim
)都使用诸如libreadline
、libtinfo
、libncurses
等库...并且应用程序或库代码以及终端仿真器程序(例如gnome-terminal
或xterm
)处理大多数控制字符和转义码。内核只处理线路规则。
顺便说一句,2017 年我们使用UTF-8 无处不在(不是ASCII码不再),所以即使终端模拟器知道关于UTF-8。统一码需要更复杂的行为(考虑用户在同一输入行中混合从左到右和从右到左的语言 - 例如英语和希伯来语或阿拉伯语)。大多数终端仿真器的行为是可配置的(例如,您可以启用或禁用音频蜂鸣声BEL
或使其仅闪烁)。
并且对各种控制字符的支持可能发生在不同的层中(或者可能不会发生,因为有些控制字符没有任何特殊含义)......
终于,图形用户界面(和小部件工具包喜欢Qt或者GTK+) 和网络界面(您可能会使用一些 HTTP 服务器库,例如利博尼翁)比以前使用更广泛。
如果你想编写一个基于文本的用户界面今天的应用程序,我强烈建议使用一些额外的库(如ncurses
等...)。
顺便说一句,可以为每个用户或伪终端调整或配置某些行为,并且一些不同的终端仿真器或多或少是可配置的;也可以看看控制台代码(4),语言环境(7),ASCII(7),UTF-8(7),字符集(7),环境(7),私人有限公司(7),信号(7),学期(7),术语(7),统一码(7)。
您还可以配置或改进一些特定的终端仿真器(它们是自由软件,这样您就可以研究和修补它们的源代码)以满足您的特定需求(并为您想要做一些有用的事情的那些奇怪的控制字符添加特定的行为)。特定终端仿真器对奇怪控制字符的行为是特定于该仿真器的;我想他们中的大多数人都会跳过或忽略其中的一些。
但是,您可以拥有设备文件(例如调制解调器、键盘等)和文件(或插座(7)-s) 处理任意字节序列(它们不需要是 ASCII 或 UTF-8,字符编码是传统的仅有的)。
AFAIK,许多控制字符(特别是水平和垂直制表符、回车、换页、转义符等)——可能是其中的大多数——不是由内核代码中实现的行规则处理的。但它们对于应用程序代码(特别是那些使用ncurses
或 的代码readline
)和终端仿真器(例如gnome-terminal
或xterm
)来说是已知的。