英文:
How to Pass Console Input to Subprocess from Golang
问题
我有以下的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:])
}
需要注意的是,上述两个程序只是测试程序,它们只代表我想要实现的目标。它们并不旨在高效,并且没有按照编程准则编写(例如,字节数组的创建方式)。如果我能解决这个小问题,我就能将其移植到我的实际软件代码中。如果有人能指导我如何做到这一点,我将不胜感激。
英文:
I have the following C
program.
#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;
}
I want to run this program as a sub-process from Go
language. In my Go
code, I have a byte
array which I want to be used as input to my C
program. I tried following approach and it did not work.
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:])
}
To be noted, both of the above program is just a test program and they only represent what I want to achieve. They are not meant to be efficient and was not written according to programming guidelines(for example the way byte array was created). If I can solve my problem for this small case, I will be able to port it to my actual software code. I would appreciate if anyone can guide me how I can do this .
答案1
得分: 1
如果你想写入子进程的标准输入,你应该使用StdinPipe
。
像这样:
subStdin, err := cmd.StdinPipe()
// 检查错误
defer subStdin.Close()
// 简单地将字节数组写入标准输入
subStdin.Write(ctrlc)
// io.WriteString(subStdin, "Hello World") 会检查管道是否是StringWriter类型,并使用该方法,如果不是,则将字符串转换为字节数组并写入。在这种情况下,我们知道该管道没有自己的写入字符串的方法。
请参阅完整示例的文档:
https://golang.org/pkg/os/exec/#Cmd.StdinPipe
英文:
If you want to write to the sub-process standard input, you should use StdinPipe
.
Like:
subStdin, err := cmd.StdinPipe()
// check err
defer subStdin.Close()
// simply write the byte array you have to stdin
subStdin.Write(ctrlc)
// io.WriteString(subStdin, "Hello World") will check if the pipe
// is a StringWriter type and use that method, if not, then convert
// the string to a byte array and write it. In this case we know
// that the pipe does not have a method for writing strings to itself.
See the docs for a complete example:
答案2
得分: 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 {
// 处理错误
}
这样应该可以得到你想要的结果...
英文:
How about:
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
}
That should give you what you want...
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论