【问题标题】:About ruby popen关于 ruby​​ popen
【发布时间】:2014-02-14 05:59:00
【问题描述】:

我正在学习ruby popen,我对一个简单的程序感兴趣:

pipe = IO.popen("-","w+")
if pipe
  pipe.puts "Get a job!"
  STDERR.puts "Child says: #{pipe.gets.chomp}"
else
  STDERR.puts "Dad says: #{gets.chomp}"
  puts "OK"
end

然后产品看起来像这样:

Dad says: Get a job!
Child says: OK

但是,当我通过删除 STDOUT 来更新代码时:

pipe = IO.popen("-","w+")
if pipe
  pipe.puts "Get a job!"
  puts "Child says: #{pipe.gets.chomp}"
else
  puts "Dad says: #{gets.chomp}"
  puts "OK"
end

然后结果变成这样:

Child says: Dad says: Get a job!

它错过了“OK”!那么,为什么?

【问题讨论】:

    标签: ruby popen


    【解决方案1】:

    没有STDERR.puts 将输出写入标准输出。子进程中的标准输出是管道。写入标准输出的任何内容都不会打印,而是发送到管道。

    子进程写2行。

    1. Dad say: Get a job!
    2. OK

    父进程读取一行(爸爸说:找份工作!),然后打印出来。

    Child says: Dad say: Get a job!
                ^^^^^^^^^^^^^^^^^^^ -- read from the pipe (stdout of child process).
    

    如果您还想打印OK,请调用pipe.gets 两次或使用pipe.read 读取孩子的所有输出:

    pipe = IO.popen("-","w+")
    if pipe
      pipe.puts "Get a job!"
      puts "Child says: #{pipe.read}"
    else
      puts "Dad says: #{gets.chomp}"
      puts "OK"
    end
    

    【讨论】:

    • @user2886717,有什么不接受的理由吗?如果答案有问题,请告诉我。
    • 别担心,我刚刚接受了你的回答。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多