]> Cypherpunks.ru repositories - gostls13.git/blob - src/os/signal/example_unix_test.go
b7047ac45cdf2c5f83c11582394d4aa36e652e0d
[gostls13.git] / src / os / signal / example_unix_test.go
1 // Copyright 2020 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 //go:build unix
6
7 package signal_test
8
9 import (
10         "context"
11         "fmt"
12         "log"
13         "os"
14         "os/signal"
15         "time"
16 )
17
18 // This example passes a context with a signal to tell a blocking function that
19 // it should abandon its work after a signal is received.
20 func ExampleNotifyContext() {
21         ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
22         defer stop()
23
24         p, err := os.FindProcess(os.Getpid())
25         if err != nil {
26                 log.Fatal(err)
27         }
28
29         // On a Unix-like system, pressing Ctrl+C on a keyboard sends a
30         // SIGINT signal to the process of the program in execution.
31         //
32         // This example simulates that by sending a SIGINT signal to itself.
33         if err := p.Signal(os.Interrupt); err != nil {
34                 log.Fatal(err)
35         }
36
37         select {
38         case <-time.After(time.Second):
39                 fmt.Println("missed signal")
40         case <-ctx.Done():
41                 fmt.Println(ctx.Err()) // prints "context canceled"
42                 stop()                 // stop receiving signal notifications as soon as possible.
43         }
44
45         // Output:
46         // context canceled
47 }