当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Open3.popen3用法及代码示例


本文简要介绍ruby语言中 Open3.popen3 的用法。

用法

popen3(*cmd, &block)

打开 stdin、stdout 和 stderr 流并启动外部可执行文件。此外,创建一个等待启动进程的线程。该线程有一个 pid 方法和一个线程变量:pid,它是已启动进程的 pid。

方块形式:

Open3.popen3([env,] cmd... [, opts]) {|stdin, stdout, stderr, wait_thr|
  pid = wait_thr.pid # pid of the started process.
  ...
  exit_status = wait_thr.value # Process::Status object returned.
}

非阻塞形式:

stdin, stdout, stderr, wait_thr = Open3.popen3([env,] cmd... [, opts])
pid = wait_thr[:pid]  # pid of the started process
...
stdin.close  # stdin, stdout and stderr should be closed explicitly in this form.
stdout.close
stderr.close
exit_status = wait_thr.value  # Process::Status object returned.

参数 env、cmd 和 opts 被传递给 Process.spawn 。可以接受命令行字符串和参数字符串列表,如下所示:

Open3.popen3("echo abc") {|i, o, e, t| ... }
Open3.popen3("echo", "abc") {|i, o, e, t| ... }
Open3.popen3(["echo", "argv0"], "abc") {|i, o, e, t| ... }

如果最后一个参数 opts 是 Hash ,则将其识别为 Process.spawn 的选项。

Open3.popen3("pwd", :chdir=>"/") {|i,o,e,t|
  p o.read.chomp #=> "/"
}

wait_thr.value 等待进程终止。块形式在返回时也等待进程。

关闭 stdin、stdout 和 stderr 不会等待进程完成。

您应该小心避免死锁。由于管道是固定长度的缓冲区, Open3.popen3 (“prog”) {|i, o, e, t| o.read } 如果程序在 stderr 上生成太多输出,则会出现死锁。您应该同时读取 stdout 和 stderr(使用线程或 IO.select )。但是,如果您不需要 stderr 输出,则可以使用 Open3.popen2 。如果合并的 stdout 和 stderr 输出没有问题,您可以使用 Open3.popen2e 。如果您确实需要将 stdout 和 stderr 输出作为单独的字符串,您可以考虑 Open3.capture3

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Open3.popen3。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。