func RunCMD() { cmd0 := exec.Command("tasklist") stdout0 , err := cmd0.StdoutPipe() // 獲取命令輸出內容 if err != nil { fmt.Println(err) return } if err := cmd0.Start(); err != nil { //開始執行命令 fmt.Println(err) return } useBufferIO := false if !useBufferIO { var outputBuf0 bytes.Buffer for { tempoutput := make([]byte, 256) n, err := stdout0.Read(tempoutput) if err != nil { if err == io.EOF { //讀取到內容的最后位置 break } else { fmt.Println(err) return } } if n > 0 { outputBuf0.Write(tempoutput[:n]) } } fmt.Println(outputBuf0.String()) } else { outputbuf0 := bufio.NewReader(stdout0) touput0 , _ , err := outputbuf0.ReadLine() if err != nil { return } fmt.Println(string(touput0)) } }
//管道模式 func RunCMDPipe() { cmd1 := exec.Command("tasklist") var outputbuf1 bytes.Buffer cmd1.Stdout = &outputbuf1 //設置輸入 if err := cmd1.Start(); err != nil { fmt.Println(err) return } if err := cmd1.Wait(); err != nil { fmt.Println(err) return } fmt.Printf("%s", outputbuf1.Bytes()) }
// 內存的命名管道實現 func MEMPIPE() { reader, writer := io.Pipe() //返回兩個值 一個是讀io 一個是寫io 讀寫會有鎖 go func() { output := make([]byte, 100) n, err := reader.Read(output) if err != nil { println(err) return } println("read", n) }() input := make([]byte, 26) for i:=65; i<=90; i++ { input[i - 65] = byte(i) } n, err := writer.Write(input) if err != nil { fmt.Println(err) } time.Sleep(time.Second * 3) fmt.Println("Write", n) }
// 系統的管道 實現原理就是讀寫文件 func SystempPIPE() { reader, writer, err := os.Pipe() //一個是讀os 一個是寫os 讀寫會有鎖 if err != nil { println(err) return } go func() { output := make([]byte, 100) n, err := reader.Read(output) if err != nil { println(err) return } println("read", n) }() input := make([]byte, 26) for i:=65; i<=90; i++ { input[i - 65] = byte(i) } n, err := writer.Write(input) if err != nil { fmt.Println(err) } time.Sleep(time.Second * 3) fmt.Println("Write", n) }