こんにちは、kurumi-bioです。
第2回目のsignalパッケージ(標準ライブラリー)の学習です。
前回の記事
APIリファレンス(過去記事の一覧)
環境
- Windows
OSバージョン:Windows11 Home 22H2
Go言語のバージョン:go version go1.20.3 windows/amd64 - Linux
OSバージョン:openSUSE Leap 15.4
Go言語のバージョン:go version go1.20.3 linux/amd64
NotifyContext関数
func NotifyContext(parent context.Context, signals ...os.Signal) (ctx context.Context, stop context.CancelFunc)
◆テストコード
package main import ( "context" "fmt" "os" "os/signal" "syscall" "time" ) func main() { var ctx context.Context var stop context.CancelFunc fmt.Printf("pid=[%d]\n", os.Getpid()) if len(os.Args) == 1 { ctx, stop = signal.NotifyContext(context.Background(), syscall.SIGTERM) } else { ctx, stop = signal.NotifyContext(context.Background(), syscall.SIGINT) } defer stop() select { case <-time.After(10 * time.Second): fmt.Println("missed signal") case <-ctx.Done(): fmt.Println(ctx.Err()) stop() } }
◆実行結果(Linux)
Reset関数
func Reset(sig ...os.Signal)
◆テストコード
package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { fmt.Printf("pid=[%d]\n", os.Getpid()) signal.Ignore(syscall.SIGINT) c := make(chan os.Signal, 1) signal.Notify(c) s := <-c fmt.Printf("signal=[%s]\n", s) if len(os.Args) == 1 { signal.Reset(syscall.SIGINT) } s = <-c fmt.Printf("signal=[%s]\n", s) }
◆実行結果(Linux)
Stop関数
func Stop(c chan<- os.Signal)
◆テストコード
package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { fmt.Printf("pid=[%d]\n", os.Getpid()) signal.Ignore(syscall.SIGINT) c := make(chan os.Signal, 1) signal.Notify(c) s := <-c fmt.Printf("signal=[%s]\n", s) if len(os.Args) == 1 { signal.Stop(c) } s = <-c fmt.Printf("signal=[%s]\n", s) }
◆実行結果(Linux)
最後までご覧いただきありがとうございます