我有以下C
程序。如何将控制台输入从Golang传递到子进程
#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:])
}
需要指出的是,上述两个程序只是一个测试程序,它们只代表我想达到的目标。它们并不意味着高效,并且不是根据编程指南编写的(例如创建字节数组的方式)。如果我能解决这个小问题的问题,我将能够将其移植到我的实际软件代码中。如果有人能指导我如何做到这一点,我将不胜感激。
任何想法如何使用上述技术将CTRL + C事件发送到子进程?我将NtTrace作为子进程运行。 NtTrace是一个系统调用追踪工具,我不能杀死它,因为它也会杀死我不想要的目标进程。如果我可以将CTRL + C事件传递给NtTrace子进程,它将优雅地释放目标进程然后退出。 – azizulhakim
您可以使用cmd.Process获取目标进程,然后使用https://golang.org/pkg/os/#Process.Signal指示该进程。如果这不起作用,您可以使用更多上下文发布另一个问题。 – eugenioy