github.com/ice-blockchain/go/src@v0.0.0-20240403114104-1564d284e521/runtime/testdata/testwinsignal/main.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "log" 7 "os" 8 "os/signal" 9 "syscall" 10 "time" 11 ) 12 13 func main() { 14 // Ensure that this process terminates when the test times out, 15 // even if the expected signal never arrives. 16 go func() { 17 io.Copy(io.Discard, os.Stdin) 18 log.Fatal("stdin is closed; terminating") 19 }() 20 21 // Register to receive all signals. 22 c := make(chan os.Signal, 1) 23 signal.Notify(c) 24 25 // Get console window handle. 26 kernel32 := syscall.NewLazyDLL("kernel32.dll") 27 getConsoleWindow := kernel32.NewProc("GetConsoleWindow") 28 hwnd, _, err := getConsoleWindow.Call() 29 if hwnd == 0 { 30 log.Fatal("no associated console: ", err) 31 } 32 33 // Send message to close the console window. 34 const _WM_CLOSE = 0x0010 35 user32 := syscall.NewLazyDLL("user32.dll") 36 postMessage := user32.NewProc("PostMessageW") 37 ok, _, err := postMessage.Call(hwnd, _WM_CLOSE, 0, 0) 38 if ok == 0 { 39 log.Fatal("post message failed: ", err) 40 } 41 42 sig := <-c 43 44 // Allow some time for the handler to complete if it's going to. 45 // 46 // (In https://go.dev/issue/41884 the handler returned immediately, 47 // which caused Windows to terminate the program before the goroutine 48 // that received the SIGTERM had a chance to actually clean up.) 49 time.Sleep(time.Second) 50 51 // Print the signal's name: "terminated" makes the test succeed. 52 fmt.Println(sig) 53 }