我有以下程序:
package main
import "bytes"
import "io"
import "log"
import "os"
import "os/exec"
import "time"
func main() {
runCatFromStdinWorks(populateStdin("aaa\n"))
runCatFromStdinWorks(populateStdin("bbb\n"))
}
func populateStdin(str string) func(io.WriteCloser) {
return func(stdin io.WriteCloser) {
defer stdin.Close()
io.Copy(stdin, bytes.NewBufferString(str))
}
}
func runCatFromStdinWorks(populate_stdin_func func(io.WriteCloser)) {
cmd := exec.Command("cat")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Panic(err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Panic(err)
}
err = cmd.Start()
if err != nil {
log.Panic(err)
}
go populate_stdin_func(stdin)
go func() {
// Removing the following lines allow some output
// to be fetched from cat's stdout sometimes
time.Sleep(5 * time.Second)
io.Copy(os.Stdout, stdout)
}()
err = cmd.Wait()
if err != nil {
log.Panic(err)
}
}
循环运行时,没有任何结果,如下所示:
$ while true; do go run cat_thingy.go; echo ; done
^C
这个结果是在虚拟机中从 apt 在 Ubuntu 12.04 上安装 golang-go 之后(go 版本 go1)。我无法在Macbook Air(执行版本go1.0.3)上的执行安装中复制。这似乎是某种比赛条件。实际上,如果我放置一个sleep(1 * time.Second),那么我永远也看不到这个问题,而我的代码却以随机休眠为代价。
我在代码中做错什么了吗,或者这是一个错误?如果是错误,是否已解决?
慕码人2483693
相关分类