【发布时间】:2011-08-02 11:25:43
【问题描述】:
当它的命令是 "-" 时,我试图理解 IO.popen,它启动了一个新的 Ruby 解释器。
关于这个主题的资料不多,我慢慢地了解它们,主要是因为我只是为了好玩而编写代码。
据我所知,当IO.popen("-", "w+") {|f| ...} 被调用时 - 这是一个块 - 该块将由 父进程和子进程运行。不同的是,父进程会因此得到一个 IO 对象,而子进程只得到一个 Nil。这很简单,我需要检查块中的|f|,当它为 Nil 时,执行在子进程中,当它不是 nil 时,执行在父进程中。所以我必须编写由if分隔的父子代码。
这次它帮助我理解了问题,块是 IO.popen 命令的一部分。
我有这个代码:
pipe = IO.popen("-","w+")
# puts "This line will break functionality if uncommented"
if pipe != nil then
pipe.puts "PID: #{Process.pid}"
$stderr.puts "Parent from child: #{pipe.gets.chomp}"
else
$stderr.puts "Child PID: #{Process.pid} and Parent #{gets.chomp}"
puts "M'kay"
end
问题:
- 是什么决定了哪个进程首先运行?如果他们要附加一个文件,它是否容易受到竞争条件的影响?
- 为什么第 2 行代码中断?
pipe = IO.popen...命令不应该与if..else..end块相关,但它们是。对我来说,pipe是一个文件句柄(就像在旧的 Turbo Pascal 中一样),它首先在某个地方定义,然后在其他地方进行操作。
【问题讨论】:
标签: ruby io subprocess popen ruby-1.9.2