Skip to content

Instantly share code, notes, and snippets.

@daniel-garcia
Created January 15, 2014 21:19
Show Gist options
  • Save daniel-garcia/8444905 to your computer and use it in GitHub Desktop.
Save daniel-garcia/8444905 to your computer and use it in GitHub Desktop.
nonblocking read from subprocess
package main
import (
"log"
"os"
"os/exec"
"syscall"
"time"
)
func main() {
cmd := exec.Command("ping", "-c", "10", "www.google.com")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}
if err := cmd.Start(); err != nil {
log.Fatal(err)
}
if raw, ok := stdout.(*os.File); !ok {
log.Fatal(err)
} else {
syscall.SetNonblock(int(raw.Fd()), true)
}
go cmd.Wait()
for {
time.Sleep(time.Second)
buffer := make([]byte, 1000)
if read, err := stdout.Read(buffer); err == nil {
log.Printf("%d read: %s", read, string(buffer[0:read-1]))
} else {
break
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment