package main
import (
"fmt"
"os"
"os/signal"
"time"
)
func reraise() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt)
s := <-ch
fmt.Println("reraising signal", s)
signal.Stop(ch)
p, err := os.FindProcess(os.Getpid())
if err != nil {
// WUT
panic(err)
}
p.Signal(os.Interrupt)
}
func catch() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, os.Interrupt)
s := <-ch
fmt.Println("exiting on signal", s)
os.Exit(1)
}
func usage() {
fmt.Printf("usage: %s (nothing|ignore|catch|reraise)\n", os.Args[0])
os.Exit(1)
}
func main() {
if len(os.Args) < 2 {
usage()
}
switch os.Args[1] {
case "nothing":
fmt.Println("doing nothing (script should stop)")
case "ignore":
fmt.Println("ignoring ^C (script should continue)")
signal.Ignore(os.Interrupt)
case "catch":
fmt.Println("handling, not reraising (script should continue)")
go catch()
case "reraise":
fmt.Println("handling & reraising (script should stop)")
go reraise()
default:
usage()
}
time.Sleep(10 * time.Second)
fmt.Println("done")
}