如何从Golang将控制台输入传递给子进程

时间:2017-07-28 17:44:57

标签: go

我有以下C计划。

#include<stdio.h>


int main() {
    int i = 0;
    char ch;

    printf("Starting test application\n");

    for (i=0; i<10; i++) {
        ch = getchar();

        printf("character at %d = %d\n", i, ch);
    }

    return 0;
}

我希望将此程序作为Go语言的子流程运行。在我的Go代码中,我有一个byte数组,我希望将其用作C程序的输入。我尝试了以下方法,但没有用。

cmd := exec.Command("/home/dodtech/go-workspace/MachineListener/Test")

cmd.Stdout = os.Stdout
err := cmd.Start()

if err == nil {
    var ctrlc [9]byte
    ctrlc[0] = 0x00
    ctrlc[1] = 0x01
    ctrlc[2] = 0x02
    ctrlc[3] = 0x03
    ctrlc[4] = 0x04
    ctrlc[5] = 0x05
    ctrlc[6] = 0x06
    ctrlc[7] = 0x07
    ctrlc[8] = 0x08
    ctrlc[9] = 0x09

    cmd.Stdin = bytes.NewReader(ctrlc[0:])
    cmd.Stdin.Read(ctrlc[0:])
}

需要注意的是,上述两个程序只是一个测试程序,它们只代表我想要实现的目标。它们并不意味着高效,也不是根据编程指南编写的(例如,字节数组的创建方式)。如果我可以解决这个小案例的问题,我将能够将其移植到我的实际软件代码中。如果有人能指导我如何做到这一点,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

怎么样:

cmd := exec.Command("/home/dodtech/go-workspace/MachineListener/Test")

cmd.Stdin = bytes.NewReader([]byte{
    0x00,
    0x01,
    0x02,
    0x03,
    0x04,
    0x05,
    0x06,
    0x07,
    0x08,
    0x09,
})
cmd.Stdout = os.Stdout

err := cmd.Start()
if err != nil {
    // Handle error
}

那应该给你你想要的东西......

答案 1 :(得分:0)

如果要写入子流程标准输入,则应使用StdinPipe

像:

subStdin, err := cmd.StdinPipe()
// check err
defer subStdin.Close()
io.WriteString(subStdin, "Hello World")

请参阅文档以获取完整示例:

https://golang.org/pkg/os/exec/#Cmd.StdinPipe