1// WARNING: This won't build on Windows and Plan9. 2 3// 4// Handling Ctrl-C cleanly in C. 5// 6 7package main 8 9import ( 10 zmq "github.com/pebbe/zmq4" 11 12 "fmt" 13 "log" 14 "os" 15 "os/signal" 16 "syscall" 17 "time" 18) 19 20func main() { 21 // Socket to talk to server 22 fmt.Println("Connecting to hello world server...") 23 client, _ := zmq.NewSocket(zmq.REQ) 24 defer client.Close() 25 client.Connect("tcp://localhost:5555") 26 27 // Without signal handling, Go will exit on signal, even if the signal was caught by ZeroMQ 28 chSignal := make(chan os.Signal, 1) 29 signal.Notify(chSignal, syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) 30 31 zmq.SetRetryAfterEINTR(false) 32 33LOOP: 34 for { 35 client.Send("HELLO", 0) 36 fmt.Println("Sent: HELLO") 37 reply, err := client.Recv(0) 38 if err != nil { 39 if zmq.AsErrno(err) == zmq.Errno(syscall.EINTR) { 40 // signal was caught by 0MQ 41 log.Println("Client Recv:", err) 42 break 43 } else { 44 // some error occurred 45 log.Panicln(err) 46 } 47 } 48 49 fmt.Println("Received:", reply) 50 time.Sleep(time.Second) 51 52 select { 53 case sig := <-chSignal: 54 // signal was caught by Go 55 log.Println("Signal:", sig) 56 break LOOP 57 default: 58 } 59 } 60} 61