为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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 关注
  • 306 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信