You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

终端原始模式未恢复且光标无法显示问题求助

终端原始模式未恢复且光标无法显示问题求助

看起来你的问题主要出在两个核心点:退出程序时没恢复终端光标的可见状态,以及光标设置不属于termios的管理范畴,单纯恢复终端输入模式没法覆盖这个设置。我来帮你一步步解决:

首先,你的clear_screen()函数里用\033[?25l隐藏了光标,但程序退出时完全没输出对应的恢复指令\033[?25h,所以终端会一直保持光标隐藏的状态。另外,虽然你通过atexit(disableRawMode)注册了终端模式恢复,但光标是通过ANSI转义码独立控制的,和termios的输入模式设置是两回事。

具体修复步骤:

  1. 新增光标恢复函数:专门用来恢复终端光标可见性,别忘了刷新输出缓冲区确保指令立即生效:
void restore_cursor()
{
    printf("\033[?25h");
    fflush(stdout);
}
  1. 把光标恢复注册到退出回调:在enableRawMode()里,除了注册disableRawMode,还要把restore_cursor也加进去,这样不管是按]正常退出,还是程序意外终止,都会自动恢复光标:
void enableRawMode()
{
    tcgetattr(0, &orig_termios);
    atexit(disableRawMode);
    atexit(restore_cursor); // 新增这行,注册光标恢复逻辑
    struct termios raw = orig_termios;
    raw.c_lflag &= ~(ECHO | ICANON);
    tcsetattr(0, TCSAFLUSH, &raw);
}
  1. 简化退出逻辑:在main函数的]分支里,不需要手动调用disableRawMode(),因为exit(0)会自动触发atexit注册的两个恢复函数,避免重复操作:
else if (c == ']')
{
    exit(0);
}

为什么之前的尝试没效果?

  • tcsetattr的TCSAFLUSH和TCSANOW只是控制终端属性的应用时机,完全不影响光标可见性设置——因为光标是ANSI转义码控制的,不属于termios结构体的管理范围。
  • 你之前只恢复了终端的原始输入模式,但没重置光标状态,所以光标会一直保持隐藏。

修改完代码后重新编译运行,按]退出时终端应该就能恢复正常的光标显示和输入模式了。

备注:内容来源于stack exchange,提问作者JJJohn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 15:53:09