亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

去管道寫入端被關閉,為什么?

去管道寫入端被關閉,為什么?

Go
jeck貓 2022-08-24 10:49:32
我剛剛閱讀了一些Go代碼,它執行了如下操作:type someType struct {    ...    ...    rpipe io.ReadCloser    wpipe io.WriteCloser}var inst someTypeinst.rpipe, inst.wpipe, _ := os.Pipe()cmd := exec.Command("some_binary", args...)cmd.Stdout = inst.wpipecmd.Stderr = inst.wpipeif err := cmd.Start(); err != nil {    ....}inst.wpipe.Close()inst.wpipe = nilsome_binary是一個長時間運行的進程。為什么關閉并設置為 nil?如果它沒有關閉會發生什么?關閉inst.wpipe是否常見/必要?inst.wpipe的 C 類比是 ?dup2(pipe_fd[1], 1)cmd.Stdout = inst.wpipe; inst.wpipe.Close()
查看完整描述

1 回答

?
慕的地8271018

TA貢獻1796條經驗 獲得超4個贊

該代碼是想要讀取由其他程序生成的輸出的程序的典型代碼。操作系統。Pipe() 函數返回一對連接的實體(或者,在出錯時 -不應簡單地忽略 -不返回),其中第二個(或)實體上的寫入在第一個( / )實體上顯示為可讀字節。但是,這是你第一個問題的答案的一半的關鍵——讀者如何知道所有作家何時都寫完了?os.Filewwpiperrpipe

要使讀取器獲得 EOF 指示,具有或有權訪問管道寫入端的所有編寫器都必須調用該操作。通過將管道的寫入端傳遞給我們以 開始的程序,我們允許該命令訪問管道的寫入端。當該命令關閉該管道時,具有訪問權限的其中一個實體已關閉該管道。但是另一個具有訪問權限的實體尚未關閉它:我們有寫入訪問權限。closecmd.Start()

要查看 EOF,則必須使用 關閉對 的訪問。 所以回答前半部分:wpipewpipe.Close()

  1. 為什么關閉并設置為 nil?inst.wpipe

集合到部分可能具有任何功能,也可能不具有任何功能;您應該檢查代碼的其余部分,以確定它是否確實如此。nil

  1. 是 C 類比dup2(pipe_fd[1], 1)cmd.Stdout = inst.wpipe; inst.wpipe.Close()?

不完全是。該級別在 POSIX OS 區域中向下,而在較高(獨立于操作系統)級別。POSIX 的實現最終將在調用(或等效項)后調用(或等效項)。等效的 POSIX 是 中的 POSIX 文件編號。dup2cmd.Stdoutcmd.Start()dup2forkinst.wipe.Close()close(wfd)wfdwpipe

在沒有任何更高層次的包裝的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


查看完整回答
反對 回復 2022-08-24
  • 1 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號