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

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

如何在 Golang 中通過 STDIN/STDOUT 同時連接多個程序讀/寫?

如何在 Golang 中通過 STDIN/STDOUT 同時連接多個程序讀/寫?

Go
慕容3067478 2021-11-08 14:51:20
在高層次上,我想完成以下工作。每個框都是一個正在運行的程序,從 STDIN 讀取并寫入 STDOUT。我想編寫一個 golang 程序來設置并運行它,以便所有生產/消費并行發生。我正在考慮使用 io.Pipe、channels 和 os.Exec 等。                            +-----------+                                                              |  PROG-1   +-----------------------+                          +---------> |           |                       v                          |           +-----------+                                                  |                                           +-------+          +-----------+                                           | DIFF  +----->    | GENERATOR |                                           |       |          +-----------+                                           +---+---+                      |                                               ^                          |                                               |                          |           +-----------+                       |                          |           |           |                       |                          +---------> |  PROG-2   +-----------------------+                                      +-----------+                                  這是一個嘗試,但它似乎不能可靠地工作,而且“DIFF”部分也沒有實現。package mainimport (    "io"    "os"    "os/exec")const UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"const LOWER = "abcdefghijklmnopqrstuvwxyz"func runProg(r io.Reader, cmd *exec.Cmd) {    cmd.Stdin = r    cmd.Stdout = os.Stdout // I want this to go to a third prog call "diff".    cmd.Run()}
查看完整描述

1 回答

?
喵喵時光機

TA貢獻1846條經驗 獲得超7個贊

這里有幾件事。您在創建所有這些管道時增加了工作量和復雜性。此外,使用 Cmd.Start() 和 Cmd.Wait() 內置同時運行命令。


package main


import (

        "fmt"

        "io"

        "os"

        "os/exec"

)


const UPPER = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

const LOWER = "abcdefghijklmnopqrstuvwxyz"


func runProg(cmd *exec.Cmd) (w io.WriteCloser, err error) {

        w, err := cmd.StdinPipe()

        if err != nil {

                fmt.Println(err)

        }

        cmd.Stdout = os.Stdout

        err = cmd.Start()

}




func runIt(r io.Reader, prog1 *exec.Cmd, prog2 *exec.Cmd) {


        w1, err := runProg(prog1)

        if err != nil {

                fmt.Println(err)

        }

        w2, err := runProg(prog2)

        if err != nil {

                fmt.Println(err)

        }


        go func() {

                defer w1.Close()

                defer w2.Close()

                mw := io.MultiWriter(w1, w2)

                io.Copy(mw, r)

        }()


}


func main() {

        generator := exec.Command("ls", "-l")

        r, err := generator.StdoutPipe()

        if err != nil {

                fmt.Println(err)

        }


        prog1 := exec.Command("tr", LOWER, UPPER)

        prog2 := exec.Command("tr", UPPER, LOWER)


        runIt(r, prog1, prog2)


        generator.Run()


        err = prog1.Wait()

        err1 := prog2.Wait()

        if err != nil || err1 != nil {

                fmt.Println(err, err1)

        }

}

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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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