#2742·ratatui

将`flush ()' 屏蔽在全pty上会冻结整个渲染回路圈,没有非屏蔽/自动逃生舱门

作者: vpelikh创建于 2026年8月30日更新于 2026年9月3日
标签Type: Bug

□ 说明

'terminal::draw ()' /'terminal::flush ()' 与fd 1(pty)同步写出. 当终端仿真器停止排出 pty 的输出缓冲器(一个背景标签,一个已死的多轴面板,一个被冻结的 SSH 会话)时,缓冲器会填充并下个"write ()" ** blocks forever **.

整个互动的TUI运行在单一渲染线上("tokio:block on"). 当一个pty写上线程块时,UI会完全冻结:Cursor,输入,动画,并滚动停止.

这是"TUI卡"失败模式.

□ 重现

  1. 运行一个在单一屏蔽线上制造的全屏TUI.
  2. 背景或断开终端,使pty输出缓冲器不被排出(例如 " kill - STOP " 终端仿真器,或拆卸母被屏蔽的tmux平板).
  3. 触发比内核pty缓冲器更大的任何帧(~在大多数系统中是几个KB).
  4. 内核上 " write() " 的渲染线条公园,永不返回;UI被冻结。

最小复制: 构建“ Terminal < CrosstermBackend < Stdout > , 将写入器设置为 pty 缓冲器已满的状态, 然后调用“ terminal. draw (.) ” , 框架大于可用的缓冲器 。 呼叫无限制地阻断。

□ 预期行为

一个TUI应该可以制成 而不冒险 一个硬的,无法恢复的线块在一个楔形的pty上。 渲染回路必须能够检测出一个摊位并清洁地退出,同时保持活服务器会话的恢复.

□ 环境

  • OS: macOS / Linux 软件
  • 终端模拟器:小猫,幽灵,苹果终端,tmux等.
  • 速率版本:ratatui 0.30.0
  • 后端:跨期

□ 附加上下文

这个问题与ratui #2483 / PR #2485(CPR Cursor-query赛车在调整尺寸时带有Stdin)不同. 问题在于get cursor position()'在draw()'期间发出阻断标准答复的电话。 这个问题涉及`flush()'屏蔽一个完整的缓冲器.

内容来源: ratatui/ratatui