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

如何捕获fork子进程的STDOUT输出?

问题原因

fork 创建的子进程拥有独立内存空间,父进程初始化的 StringIO 对象无法被子进程共享修改。你当前代码里,子进程把 $stdout 改回了原标准输出,导致内容直接打印到终端,父进程的 results 自然拿不到输出。

解决方法:用管道实现父子进程 stdout 传递

使用 IO.pipe 创建管道,让子进程将标准输出重定向到管道的写入端,父进程从管道的读取端获取子进程的输出内容。

# 创建管道,r是读端,w是写端
r, w = IO.pipe

if pid = fork
  # 父进程:关闭写端,读取管道内容
  w.close
  results = r.read
  r.close
  Process.wait(pid)

  # 恢复标准输出并打印结果
  puts 'results from child:'
  puts results
else
  # 子进程:关闭读端,将stdout重定向到管道写端
  r.close
  $stdout.reopen(w)
  $stderr.reopen(w) # 可选:如果需要捕获stderr也加上
  puts 'stuff in child process'
  exit
end
代码说明
  • IO.pipe 创建双向管道,父进程保留读端,子进程将标准输出重定向到写端。
  • 父子进程都要关闭不需要的管道端,避免资源泄漏。
  • 父进程通过 r.read 读取子进程的所有输出,直到子进程关闭写端(exit时会自动关闭)。

内容的提问来源于stack exchange,提问作者tscheingeld

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 12:42:34