本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。