如何捕获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
相关产品推荐
相关产品推荐

