Чтение stdin из фонового процесса go приводит к ошибкам EOF - PullRequest
0 голосов
/ 26 апреля 2018

Я пишу плагин для Micro , который создает фоновый процесс. Когда фоновый процесс выполняется, он постоянно читает байты из стандартного ввода - но это всегда ошибка EOF.

В Micro мой фоновый процесс создается как с функцией JobSpawn, которая возвращает * exec.cmd:

// JobSpawn starts a process with args in the background with the given callbacks
// It returns an *exec.Cmd as the job id
func JobSpawn(cmdName string, cmdArgs []string, onStdout, onStderr, onExit string, userargs ...string) *exec.Cmd {
    // Set up everything correctly if the functions have been provided
    proc := exec.Command(cmdName, cmdArgs...)
    var outbuf bytes.Buffer
    if onStdout != "" {
        proc.Stdout = &CallbackFile{&outbuf, LuaFunctionJob(onStdout), userargs}
    } else {
        proc.Stdout = &outbuf
    }
    if onStderr != "" {
        proc.Stderr = &CallbackFile{&outbuf, LuaFunctionJob(onStderr), userargs}
    } else {
        proc.Stderr = &outbuf
    }

    go func() {
        // Run the process in the background and create the onExit callback
        proc.Run()
        jobFunc := JobFunction{LuaFunctionJob(onExit), string(outbuf.Bytes()), userargs}
        jobs <- jobFunc
    }()

    return proc
}

Я бы хотел время от времени отправлять данные процессу. Данные передаются в стандартный поток процесса с помощью микро-функции JobSend:

// JobSend sends the given data into the job's stdin stream
func JobSend(cmd *exec.Cmd, data string) {
    stdin, err := cmd.StdinPipe()
    if err != nil {
        return
    }

    stdin.Write([]byte(data))
}

Это мой код процесса, который читает stdin с помощью Bufio Reader в цикле for:

package main

import ("fmt"
    "bufio"
    "os")

func main() {
    for {
        reader := bufio.NewReader(os.Stdin)
        arr, err := reader.ReadBytes('\n')
        if err != nil {
            fmt.Print(err)
        } else {
            fmt.Print(arr)
        }   
    }
}

Сразу после создания задания начинается печать ошибок EOF. Этого не происходит, когда я запускаю программу в своей оболочке, прежде чем какие-либо данные будут отправлены на стандартный ввод. Ничего не происходит, когда я звоню JobSend. Я даже добавил условие, чтобы ничего не печатать в случае ошибки или если длина данных не превышает 0, но тогда я вообще не получаю вывод.

1 Ответ

0 голосов
/ 27 апреля 2018

Я думаю, вам нужно позвонить StdinPipe до Run.

...