2017-07-28 17 views
0

私は以下の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配列を持っています。私は次のアプローチを試したが、うまくいかなかった。

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

サブプロセスの標準入力に書き込む場合は、StdinPipeを使用してください。

同様:

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

は完全な例のためのドキュメントを参照してください。

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

+0

上記の手法を使ってサブプロセスにCTRL + Cイベントをどのように送ることができますか?私はサブプロセスとしてNtTraceを実行しています。 NtTraceはシステムコールトレーシングツールであり、私が望んでいないターゲットプロセスを殺すので、それを殺すことはできません。 CTRL + CイベントをNtTraceサブプロセスに渡すことができれば、正常にターゲットプロセスを解放して終了します。 – azizulhakim

+0

cmd.Processを使用してターゲットプロセスを取得し、https://golang.org/pkg/os/#Process.Signalを使用してプロセスに通知できます。それでも問題がなければ、より多くの文脈で別の質問を投稿することができます。 – eugenioy

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 
} 

...

関連する問題