1 回答

TA貢獻1796條經驗 獲得超4個贊
該代碼是想要讀取由其他程序生成的輸出的程序的典型代碼。操作系統。Pipe()
函數返回一對連接的實體(或者,在出錯時 -不應簡單地忽略 -不返回),其中第二個(或)實體上的寫入在第一個( / )實體上顯示為可讀字節。但是,這是你第一個問題的答案的一半的關鍵——讀者如何知道所有作家何時都寫完了?os.File
w
wpipe
r
rpipe
要使讀取器獲得 EOF 指示,具有或有權訪問管道寫入端的所有編寫器都必須調用該操作。通過將管道的寫入端傳遞給我們以 開始的程序,我們允許該命令訪問管道的寫入端。當該命令關閉該管道時,具有訪問權限的其中一個實體已關閉該管道。但是另一個具有訪問權限的實體尚未關閉它:我們有寫入訪問權限。close
cmd.Start()
要查看 EOF,則必須使用 關閉對 的訪問。 所以回答前半部分:wpipe
wpipe.Close()
為什么關閉并設置為 nil?
inst.wpipe
集合到部分可能具有任何功能,也可能不具有任何功能;您應該檢查代碼的其余部分,以確定它是否確實如此。nil
是 C 類比
dup2(pipe_fd[1], 1)
cmd.Stdout = inst.wpipe; inst.wpipe.Close()?
不完全是。該級別在 POSIX OS 區域中向下,而在較高(獨立于操作系統)級別。POSIX 的實現最終將在調用(或等效項)后調用(或等效項)。等效的 POSIX 是 中的 POSIX 文件編號。dup2
cmd.Stdout
cmd.Start()
dup2
fork
inst.wipe.Close()
close(wfd)
wfd
wpipe
在沒有任何更高層次的包裝的C代碼中,我們將有這樣的東西:
int fds[2];
if (pipe(fds) < 0) ... handle error case ...
pid = fork();
switch (pid) {
case -1: ... handle error ...
case 0: /* child */
if (dup2(fds[1], 1) < 0 || dup2(fds[1], 2) < 0) ... handle error ...
if (execve(prog, args, env) < 0) ... handle error ...
/* NOTREACHED */
default: /* parent */
if (close(fds[1]) < 0) ... handle error ...
... read from fds[0] ...
}
(盡管如果我們足夠小心地檢查來自 的錯誤,我們可能應該足夠小心地檢查系統調用是否在這里給了我們描述符0和1,或1和2,或2和3 - 盡管也許我們通過確保0,1和2至少對)進行處理。closepipe/dev/null
- 1 回答
- 0 關注
- 126 瀏覽
添加回答
舉報