需要说明的是,这与复制粘贴无关,这可能就是为什么很难找到答案的原因。
我正在尝试将文字CTRL-C
字符插入来自 TTY 的流中。在大多数情况下,这意味着字符0x03
。通常,如果您发送0x03
到 TTY,它将向进程发送中断(因为它是 INTR 的标准控制代码)。但是,我想将该字符发送到正在运行的进程无需进入原始模式。
通常情况下,VLNEXT
字符 将是解决方案(通常分配给CTRL-V
或0x10
)。例如,执行以下操作:
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
定义的。此字符通常不是,它指的是。我可能在某处读取了该值并将其误解为十进制。VLNEXT
0x16
0x10
CTRL-V
在数据前加上 前缀后0x16
,我就可以安全地通过交互式 TTY 发送控制字符,而无需触发信号。但需要注意的是, 不是标准的,可以通过或设置0x16
轻松修改。stty
termios