代码之家  ›  专栏  ›  技术社区  ›  anonymous coward

如何在Ruby中打开进程的STDIN?

  •  1
  • anonymous coward  · 技术社区  · 14 年前

    我有一组任务需要从Ruby脚本运行,但是有一个特定的任务总是在退出之前等待STDIN上的EOF。

    显然,这会导致脚本在等待子进程结束时挂起。

    我有子进程的进程ID,但没有管道或任何类型的句柄。我如何打开进程的STDIN句柄来向它发送EOF?

    1 回复  |  直到 14 年前
        1
  •  8
  •   Aidan Cully    14 年前

    编辑: 考虑到您没有启动脚本,我想到的一个解决方案是在使用gem时将$stdin置于您的控制之下。我建议如下:

    old_stdin = $stdin.dup
    # note that old_stdin.fileno is non-0.
    # create a file handle you can use to signal EOF
    new_stdin = File::open('/dev/null', 'r')
    # and make $stdin use it, instead.
    $stdin.reopen(new_stdin)
    new_stdin.close
    # note that $stdin.fileno is still 0, though now it's using /dev/null for input.
    # replace with the call that runs the external program
    system('/bin/cat')
    # "cat" will now exit.  restore the old state.
    $stdin.reopen(old_stdin)
    old_stdin.close
    

    如果您的ruby脚本正在创建任务,它可以使用 IO::popen . 例如, cat 在没有参数的运行时,在退出前会等待EOF上的EOF,但您可以运行以下内容:

    f = IO::popen('cat', 'w')
    f.puts('hello')
    # signals EOF to "cat"
    f.close