Skip to content

[0141] 修复 Windows 平台 subprocess 管道捕获失败问题 - #962

Merged
da-liii merged 2 commits into
mainfrom
da/0141/subprocess_pipe
Aug 31, 2026
Merged

[0141] 修复 Windows 平台 subprocess 管道捕获失败问题#962
da-liii merged 2 commits into
mainfrom
da/0141/subprocess_pipe

Conversation

@da-liii

@da-liii da-liii commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

[0141] 修复 Windows 平台 subprocess 管道捕获导致 gf pr / run-values 失败的问题

任务相关的代码文件

  • src/liii_subprocess.cpp
  • tests/liii/subprocess/run-values-test.scm
  • tests/liii/subprocess/run-pipe-test.scm

如何测试

xmake b goldfish
bin/gf tests/liii/subprocess/run-values-test.scm
bin/gf tests/liii/subprocess/run-pipe-test.scm
bin/gf test tools/pr/tests/liii/goldpr/parse-pr-args-test.scm
bin/gf test tools/pr/tests/liii/goldpr/pr-remote-url-test.scm

2026-08-31 修复 Windows 下 subprocess 管道捕获

What

  1. 修复 Windows 平台上 (liii subprocess) 在执行管道重定向(:stdout 'capture:stderr 'capture:inputrun-pipe)时无法正确捕获输出甚至报错的问题。
  2. 修复 gf pr 在 Windows 下因 pr-remote-url 无法捕获 git 输出而误报 Error: no origin remote found in this repository 的问题。
  3. 补全并在 Windows 下启用 run-values-test.scmrun-pipe-test.scm 的捕获与管道断言测试。

Why

在 Windows 平台上,tbox 的 tb_pipe_file_init_pair 内部通过带有 FILE_FLAG_OVERLAPPED 标志的具名管道实现异步 I/O。当子进程(如 Git、Python 或标准 C 运行时程序)继承该句柄并使用同步 WriteFile 写入时,Windows API 会返回 ERROR_INVALID_PARAMETER (Errno 22),导致写入失败、输出捕获为空字符串。

How

  1. 在 Windows 平台(_WIN32)下,使用原生 Win32 API CreatePipe 创建同步管道,句柄传递给子进程的 attr.out.file / attr.err.file / attr.in.file 并标记继承。
  2. 父进程在启动子进程后关闭管道的写端/读端无用句柄,避免阻塞 EOF。
  3. 父进程使用同步 ReadFile 循环读取子进程管道输出直至 EOF,正确填充 stdout_str / stderr_str
  4. 更新 tests/liii/subprocess/run-values-test.scmrun-pipe-test.scm,加入 Windows 平台的管道捕获与串联管道验证。

@da-liii
da-liii merged commit 1fd10c8 into main Aug 31, 2026
5 checks passed
@da-liii
da-liii deleted the da/0141/subprocess_pipe branch August 31, 2026 11:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant