Как я могу запустить двоичный файл в моей программе golang и продолжать взаимодействовать с ним, посылая какие-то входные данные и ожидая результатов? - PullRequest
0 голосов
/ 06 февраля 2019

Как я могу запустить двоичный файл в моей программе golang и продолжать взаимодействовать с ним, посылая некоторые входные данные и ожидая результатов?В том, что я сделал, я запускаю только один раз.И я хочу, чтобы этот двоичный файл работал и взаимодействовал с ним, я не хочу запускать его несколько раз.

package main

import (
    "os/exec"
    "bytes"
    "fmt"
)

func main() {
    command := exec.Command("./program")
    var output bytes.Buffer
    command.Stdout = &output
    command.Run()
    result := output.String()
    IV := result[:4]
    cipher := result[5:]
    cipher = cipher[:len(cipher)-1]
    fmt.Printf("%v", result)
    fmt.Printf("%v", IV)
    fmt.Printf("%v", cipher)
}

1 Ответ

0 голосов
/ 06 февраля 2019

Я считаю, что правильный путь для достижения этой цели - использование StdinPipe и StdoutPipe методов exec.Cmd.

См. Примеры в https://golang.org/pkg/os/exec/#Cmd.StdinPipe, и т. Д.


Вот пример, который вызывает команду bc (встроенный калькулятор, который берет вычисления из стандартного ввода и отправляет результаты в стандартный вывод) и немного взаимодействует с ним:

package main

import (
    "bufio"
    "fmt"
    "log"
    "os/exec"
)

func main() {
    cmd := exec.Command("bc", "-q")

    stdin, err := cmd.StdinPipe()
    if err != nil {
        log.Fatal(err)
    }

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Fatal(err)
    }

    if err := cmd.Start(); err != nil {
        log.Fatal(err)
    }

    stdin.Write([]byte("2 + 2\n"))

    r := bufio.NewReader(stdout)
    b, err := r.ReadBytes('\n')
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Read:", string(b))
}

В реальной программе выможет захотеть запустить эту вещь в обычной программе, чтобы она не блокировала остальную часть приложения, происходила в фоновом режиме и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...