使用管道与程序过程进行通信

从Golang程序中生成某些程序后,我希望能够与它们完全通讯。我已经拥有的是生成过程并根据从stdout读取的最后一行通过管道进行对话:


package main


import (

    "fmt"

    "io"

    "log"

    "os/exec"

    "strings"

)


var stdinPipe io.WriteCloser

var stdoutPipe io.ReadCloser

var err error


func main() {

    cmd := &exec.Cmd{

        Path: "/Users/seba/Projects/go/src/bootstrap/in",

        Args: []string{"program"},

    }


    stdinPipe, err = cmd.StdinPipe()


    if err != nil {

        log.Fatal(err)

    }


    stdoutPipe, err = cmd.StdoutPipe()


    if err != nil {

        log.Fatal(err)

    }


    err = cmd.Start()


    if err != nil {

        log.Fatal(err)

    }


    var stdoutLines []string

    go stdoutManage(stdoutLines, stdoutController)


    cmd.Wait()

}


// TODO: imporove as in io.Copy

func stdoutManage(lines []string, manager func(string)) {

    buf := make([]byte, 32*1024)


    for {

        nr, err := stdoutPipe.Read(buf)


        if nr > 0 {

            thelines := strings.Split(string(buf), "\n")

            for _, l := range thelines {

                manager(l)

                lines = append(lines, l)

            }

        }


        buf = make([]byte, 32*1024) // clear buf


        if err != nil {

            break

        }

    }

}

但是,这种方法在清除终端输出的程序和以某种方式缓冲标准输入或根本不使用标准输入的程序方面存在问题(不知道是否可能)。


那么问题来了:是否存在一种与程序进行通信的可移植方式(它可以是非Golang解决方案)?


慕森卡
浏览 249回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go