Вы заменяете дескрипторы файла процесса, которые обычно *os.File
, другими типами Go. Для того чтобы stdin действовал как поток, пакет os/exec
должен запустить программу, чтобы скопировать данные между io.Reader
и процессом. Это задокументировано в пакете os/exec
:
// Otherwise, during the execution of the command a separate
// goroutine reads from Stdin and delivers that data to the command
// over a pipe. In this case, Wait does not complete until the goroutine
// stops copying, either because it has reached the end of Stdin
// (EOF or a read error) or because writing to the pipe returned an error.
Если вы посмотрите на трассировку стека из вашей программы, вы увидите, что она ожидает завершения выполнения io-подпрограмм в Wait()
:
goroutine 1 [chan receive]:
os/exec.(*Cmd).Wait(0xc000076000, 0x0, 0x0)
/usr/local/go/src/os/exec/exec.go:510 +0x125
main.main()
Поскольку вы теперь управляете потоком данных, вы можете закрыть его при необходимости. Если Stdin здесь не нужен, не назначайте его вообще. Если он будет использоваться, то вы должны Close()
вернуть его Wait()
.
Другой вариант - убедиться, что вы , используя *os.File
, что Самый простой способ - использовать методы StdinPipe
, StdoutPipe
и StderrPipe
, которые в свою очередь используют os.Pipe()
, Этот способ гарантирует, что процесс имеет дело только с *os.File
, а не с другими Go типами.