【问题标题】:How to Pass Console Input to Subprocess from Golang如何从 Golang 将控制台输入传递给子进程
【发布时间】:2017-07-29 03:54:00
【问题描述】:

我有以下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:])
}

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

【问题讨论】:

    标签: go


    【解决方案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
    }
    

    这应该给你你想要的......

    【讨论】:

      【解决方案2】:

      如果要写入子进程标准输入,应该使用StdinPipe

      喜欢:

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

      完整示例请参阅文档:

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

      【讨论】:

      • 知道如何使用上述技术将 CTRL+C 事件发送到子进程吗?我将 NtTrace 作为子进程运行。 NtTrace 是一个系统调用跟踪工具,我不能杀死它,因为这也会杀死我不想要的目标进程。如果我可以将 CTRL+C 事件传递给 NtTrace 子进程,它将优雅地释放目标进程然后退出。
      • 您可以使用 cmd.Process 获取目标进程,然后使用 golang.org/pkg/os/#Process.Signal 向该进程发出信号。如果这不起作用,您可以发布另一个具有更多上下文的问题。
      猜你喜欢
      • 2011-12-27
      • 2013-05-09
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 1970-01-01
      相关资源
      最近更新 更多