signal.Notify
を使ったのでメモ。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func init() {
var sc = make(chan os.Signal)
signal.Notify(sc, syscall.SIGABRT, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
go func() {
for {
s := <-sc
fmt.Printf("IGNORE: %s\n", s)
}
}()
}
func main() {
p, _ := os.FindProcess(os.Getpid())
for _, s := range []os.Signal{syscall.SIGABRT, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP} { //*_ for syntax highlight
fmt.Printf("Signal: %s\n", s)
p.Signal(s)
time.Sleep(1 * time.Second)
}
}
|
以下の様に自分で投げるとSignalが投げられて到達する前にほかのSignalが到達してしまい前のが見えなくなる挙動がみられた。
チャンネルの長さを伸ばして解消するか確認が必要。それでも駄目ならコード読まないと不安。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
$ go version
[No write since last change]
go version go1.5.1 darwin/amd64
$ go run ./sig_sample.go
Signal: abort trap
Signal: interrupt
IGNORE: interrupt
Signal: terminated
IGNORE: terminated
Signal: hangup
IGNORE: hangup
$ go run ./sig_sample.go
Signal: abort trap
IGNORE: abort trap
Signal: interrupt
IGNORE: interrupt
Signal: terminated
IGNORE: terminated
Signal: hangup
IGNORE: hangup
|