![控制字符、信号和端子之间的关系](https://linux22.com/image/84818/%E6%8E%A7%E5%88%B6%E5%AD%97%E7%AC%A6%E3%80%81%E4%BF%A1%E5%8F%B7%E5%92%8C%E7%AB%AF%E5%AD%90%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB.png)
控制字符和信号之间有什么关系?或者说他们没有关系?
终端是否接收控制字符?
终端接收到控制字符后,向进程发送信号是否是终端对接收到的控制字符可能采取的操作之一?
例如,
在 Linux 中,在终端中,Ctrl+C 将终止正在运行的前台进程。在 ASCII 中,Ctrl+C 是一个控制字符,表示“文本结束”。
在 ASCII 中,Ctrl+D 是控制字符,表示传输结束。控制字符是否使终端向某个进程发送一些信号?
答案1
这终端驱动程序(操作系统的一部分)建立之间的关系特殊字符和信号。你的终端设置,例如,使用stty
,是它用来决定如何处理您键入的字符(如果有的话)的内容。您可以根据需要重新分配这些特殊字符,但有一些注意事项:
- 每个函数只有一个特殊字符
- 仅使用单字节字符
controlC并且controlD是传统的:虽然一些应用程序可能对这些值进行硬编码,但终端驱动程序不需要这样做。
终端驱动程序是软件,不是您的一部分终端。对于某些键盘,您可能会发现特殊字符的不同分配比其他键盘更方便(并且对于不同的操作系统,特殊字符的默认值的一些选择可能会有所不同)。
进一步阅读:
- 11.1.9 特殊字符(POSIX *通用终端接口)
- 11. 通用终端接口
- stty - 设置终端选项
答案2
控制字符和信号有些相关。您可以通过stty -a
终端中的命令查看信号和字符之间的匹配情况。我可以访问的 RHEL 服务器显示:
-bash-3.2$ stty -a
speed 38400 baud; rows 24; columns 135; 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; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-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 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
其中一些与 TTY 及其输入功能有关,其他与信号有关。信号部分:
intr = ^C; quit = ^\; susp = ^Z;
这意味着 SIGINT 是 control-C,SIGQUIT 是 control-反斜杠,SIGSTOP 是 control-Z。如果您愿意,您可以重新分配其中任何一个或全部。看man stty
。
其他控制字符如erase
或werase
被终端驱动程序本身拦截和使用。就像您退格时一样,终端驱动程序会从屏幕和输入流中删除一个字符。终端驱动程序的“模式”(生的或熟的,可能部分熟的)也会产生影响。文本编辑器喜欢vim
并emacs
大量使用控制字符,当您键入这些控制字符时,它们不会收到 SIGINT 或 SIGQUIT 或其他任何信号。程序可以将 TTY 设置为“原始模式”,并且只读取字节,而无需终端驱动程序进行解释。