TTY 中的 Ctrl-V 无法转义 Ctrl-C

TTY 中的 Ctrl-V 无法转义 Ctrl-C

需要说明的是,这与复制粘贴无关,这可能就是为什么很难找到答案的原因。

我正在尝试将文字CTRL-C字符插入来自 TTY 的流中。在大多数情况下,这意味着字符0x03。通常,如果您发送0x03到 TTY,它将向进程发送中断(因为它是 INTR 的标准控制代码)。但是,我想将该字符发送到正在运行的进程无需进入原始模式

通常情况下,VLNEXT字符 将是解决方案(通常分配给CTRL-V0x10)。例如,执行以下操作:

dd of=test bs=1 count=2

然后按下CTRL-V ESC ENTER将生成一个包含序列 的文件0x1B 0x0A。但是,这不适用于CTRL-C。执行相同的操作并输入CTRL-V CTRL-C只会将 SIGINT 传递给dd并终止程序。根据VLNEXT中的文档termios(s),我的理解是这个前缀应该适用于任何具有特殊含义的字符。

摘录termios(3)VLNEXT

  VLNEXT (not in POSIX; 026, SYN, Ctrl-V) Literal next (LNEXT).  Quotes the next input character, depriving
         it of a possible special meaning.  Recognized when IEXTEN is set, and then not passed as input.

最后,我的当前stty设置(iexten已启用并lnext设置为^V):

$ stty -a
speed 38400 baud; rows 51; columns 115; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab3 bs0 vt0 ff0
isig icanon iexten echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

编辑

我认为值得一提的是,我在启用原始模式的情况下尝试执行的操作相当于运行以下命令:

stty raw -echo; dd of=test bs=1 count=1; stty sane

然后按CTRL-C。这将生成一个仅包含 的文件0x03。这显然是一个简化的示例,但它是我需要做的事情。我无法在运行命令之前启用原始模式(我需要控制序列才能继续工作),但我需要将原始数据发送到正在运行的命令并避免被控制 TTY 解释。

答案1

我想回过头来回答我的问题。我走在正确的轨道上,但字节值是错误的。从技术上讲,这是由termios 设置中的字符CTRL-V定义的。此字符通常不是,它指的是。我可能在某处读取了该值并将其误解为十进制。VLNEXT0x160x10CTRL-V

在数据前加上 前缀后0x16,我就可以安全地通过交互式 TTY 发送控制字符,而无需触发信号。但需要注意的是, 不是标准的,可以通过或设置0x16轻松修改。sttytermios

相关内容