我在使用修改后的 Stdin 时遇到了 exec.Wait() 的奇怪行为。我只是修改 Stdin,以便能够复制其内容、计算数据量……但这不是这里的问题。
我制作这个精简程序只是为了演示奇怪的行为:
使用修改后的标准输入,cmd.Wait()
无限期地等待......直到我按“enter”或“^C”
使用未经修改的标准输入(取消注释该行cmd.Stdin = os.Stdin
),程序可以完美地处理到最后。
当我用 Delve () 启动这个程序(使用修改后的标准输入)时dlv debug
,程序完美地处理到最后!
我还在和之间添加了time.Sleep
30 秒,然后将程序附加到 Delve ( )。当我输入 时,无限期地等待......直到我按“enter”或“^C”cmd.Start()
cmd.Wait()
dlv attach PID
continue
cmd.Wait()
我用 go1.11 和 go1.12 测试了这些行为
package main
import (
"fmt"
"os"
"os/exec"
)
type Splitter struct {
f *os.File
fd int
}
func NewSplitter(f *os.File) *Splitter {
return &Splitter{f, int(f.Fd())}
}
func (s *Splitter) Close() error {
return s.f.Close()
}
func (s *Splitter) Read(p []byte) (int, error) {
return s.f.Read(p)
}
func (s *Splitter) Write(p []byte) (int, error) {
return s.f.Write(p)
}
func main() {
var cmd *exec.Cmd
cmd = exec.Command("cat", "foobarfile")
cmd.Stdin = NewSplitter(os.Stdin)
//cmd.Stdin = os.Stdin
cmd.Stdout = NewSplitter(os.Stdout)
cmd.Stderr = NewSplitter(os.Stderr)
cmd.Start()
cmd.Wait()
fmt.Println("done")
}
我做错了什么吗?
感谢您的帮助。
白猪掌柜的
精慕HU
相关分类