本文简要介绍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 Open3.popen2e用法及代码示例
- Ruby Open3.popen2用法及代码示例
- Ruby Open3.pipeline用法及代码示例
- Ruby Open3.pipeline_rw用法及代码示例
- Ruby Open3.pipeline_w用法及代码示例
- Ruby Open3.pipeline_r用法及代码示例
- Ruby Open3.pipeline_start用法及代码示例
- Ruby Open3.capture3用法及代码示例
- Ruby Open3.capture2用法及代码示例
- Ruby Open3.capture2e用法及代码示例
- Ruby OpenStruct.ostruct[name] =用法及代码示例
- Ruby OpenSSL.fips_mode =用法及代码示例
- Ruby OpenSSL模块用法及代码示例
- Ruby OpenRead.open用法及代码示例
- Ruby OpenSSL.print_mem_leaks用法及代码示例
- Ruby OpenURI模块用法及代码示例
- Ruby OpenStruct类用法及代码示例
- Ruby OpenSSL.Digest用法及代码示例
- Ruby OpenStruct.==用法及代码示例
- Ruby OpenStruct.each_pair用法及代码示例
- Ruby OpenStruct.delete_field用法及代码示例
- Ruby OpenStruct.dig用法及代码示例
- Ruby OpenStruct.new用法及代码示例
- Ruby OpenStruct.ostruct[name]用法及代码示例
- Ruby Option.level用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Open3.popen3。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。