已经解决了,
问题原自 cmd.StdinPipe() 的用法,看源码中, StdinPipe 在第一次被调用时, 会检查cmd.Stdin 参数是否复制,如果有将会抛出错误, 后续不会有参数传递进去。
另外一个原因是cmd.StdinPipe必须在cmd.Start 或者cmd.Run 之前并且 在同一个线程内执行一次.然后它反馈的变量就可以灵活使用了
修改后的manage.go 代码:
package main
import (
"fmt"
"io"
"os"
"os/exec"
//"time"
)
func main() {
cmd := exec.Command("./stdin")
stdout, err := cmd.StdoutPipe()
if err != nil {
fmt.Println("mange", err)
return
}
stdin, err := cmd.StdinPipe()
if err != nil {
fmt.Println(err)
return
}
//os.NewFile(fd, name)
cmd.Start()
go io.Copy(os.Stdout, stdout)
stdin.Write([]byte("bbbbbb\n"))
stdin.Write([]byte("bbbbbb\n"))
stdin.Write([]byte("bbbbbb\n"))
stdin.Write([]byte("bbbbbb\n"))
cmd.Wait()
fmt.Println("over")
}
在 2014年2月14日星期五UTC+8下午5时19分59秒,莫比斯拉皮写道: