我有以下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:])
}
需要注意的是,上述两个程序只是一个测试程序,它们只代表我想要实现的目标。它们并不意味着高效,也不是根据编程指南编写的(例如,字节数组的创建方式)。如果我可以解决这个小案例的问题,我将能够将其移植到我的实际软件代码中。如果有人能指导我如何做到这一点,我将不胜感激。
答案 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")
请参阅文档以获取完整示例: