Bash关闭ICANON/ECHO非规范模式时如何显示^C(SIGINT)
非规范模式Shell开发:关闭ECHO后^C回显配置问题
我正在开发一款尝试模拟Bash行为的shell程序。已知Bash接收用户输入时会启用非规范模式并关闭ECHO标志,相关配置逻辑如下:
(*conf)->newterm.c_lflag &= ~(ICANON | ECHO);
但按照相同逻辑配置测试时出现了和Bash表现不一致的问题:关闭ECHO后,终端触发SIGINT时Bash仍会显示^C,但我自己的实现仅能得到打印值为-1的乱码字符�。
观察Bash的实际行为可以发现:除对应SIGINT的Ctrl+C外,其余控制字符均不会被显示。我最初推测Bash硬编码了C的输出逻辑,检测到SIGINT时直接将`^C`打印到屏幕,需要确认该推测是否成立;如果该推测不成立,Bash、ZSH在关闭ECHO与ICANON的前提下是如何实现C显示的。
补充信息
现有终端初始化逻辑
tcgetattr(STDIN_FILENO, &(*conf)->oldterm); (*conf)->newterm = (*conf)->oldterm; (*conf)->newterm.c_lflag &= ~(ICANON | ECHO); tcsetattr(STDIN_FILENO, TCSANOW, &(*conf)->newterm); // 配置立即生效
现象排查与目标效果
实际测试时按下Ctrl+C仅会触发换行,不会显示^C,排查确认原因是关闭ECHO时ECHOCTL标志也会被同步禁用。
我希望实现的效果为:
- 按下Ctrl+C时显示
^C - 按上方向键等功能键时,不会显示
^[[A这类原始转义序列
需要确认如何正确配置termios参数实现该需求。
内容的提问来源于stack exchange,提问作者Liwinux
相关产品推荐
相关产品推荐

