上卷 程序设计
中卷 标准库
- bufio 1.18
- bytes 1.18
- io 1.18
- container 1.18
- encoding 1.18
- crypto 1.18
- hash 1.18
- index 1.18
- sort 1.18
- context 1.18
- database 1.18
- connection
- query
- queryrow
- exec
- prepare
- transaction
- scan & null
- context
- tcp
- udp
- http
- server
- handler
- client
- h2、tls
- url
- rpc
- exec
- signal
- embed 1.18
- plugin 1.18
- reflect 1.18
- runtime 1.18
- KeepAlived
- ReadMemStats
- SetFinalizer
- Stack
- sync 1.18
- atomic
- mutex
- rwmutex
- waitgroup
- cond
- once
- map
- pool
- copycheck
- nocopy
- unsafe 1.18
- fmt 1.18
- log 1.18
- math 1.18
- time 1.18
- timer
下卷 运行时
源码剖析
附录
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
signal
信号是软中断(software interrupts),提供一种处理异步事件机制。
事件可能来自系统外部(用户中断),也可能来自程序内部或者内核。
作为进程间通信 (IPC)的基础构成,可向其它进程发送信号。
针对信号的操作包括:忽略和捕获。
如果不做处理,则执行默认操作。
SIGHUP
: 控制终端关闭。SIGINT
: 用户产生中断字符(CTRL + C
)。SIGQUIT
: 用户产生退出字符(CTRL + \
)。SIGTERM
: 进程终止,通常是kill
操作。
大部分信号定义都在 syscall
包, os
仅有两个。
// os var ( Interrupt Signal = syscall.SIGINT Kill Signal = syscall.SIGKILL )
默认情况下:
SIGINT
、SIGTERM
、SIGHUP
导致进程终止。SIGQUIT
终止进程前生成core dump
。SIGKILL
(kill -9)和SIGSTOP
不能被忽略和捕获。
改变信号默认行为方式,用 Notify
函数注册信号通道。
package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { sig := make(chan os.Signal) signal.Notify(sig, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM) go func() { for s := range sig { fmt.Println(s) } }() fmt.Println(os.Getpid()) // kill -9 select {} } /* 598 interrupt kill -s INT 598 quit kill -s QUIT 598 terminated kill -s TERM 598 killed kill -s KILL 598 */
Ignore
:忽略信号的默认行为。(不做任何应对,可被Notify
重新设置)Reset
:按Signal
恢复默认行为。(不包括被Ignore
忽略的信号)Stop
:按Notify chan
恢复默认行为。
func main() { signal.Ignore(syscall.SIGINT) // CTRL + C 被忽略。 fmt.Scanln() }
func main() { sig1 := make(chan os.Signal) sig2 := make(chan os.Signal) signal.Notify(sig1, syscall.SIGINT) signal.Notify(sig2, syscall.SIGQUIT) for { select { case s := <- sig1: fmt.Println(s) case s := <- sig2: signal.Stop(sig1); fmt.Println(s) } } } // 按 CTRL + \ 后恢复 sig1 关联信号的默认行为。 // 如果换成 Reset,可指定具体的信号(或全部),与哪个 chan 无关。
除退出信号外,还常用 SIGUSR1
、 SIGUSR2
实现通知事件,比如重载配置文件。
package main import ( "fmt" "os" "os/signal" "syscall" ) func main() { sig := make(chan os.Signal) signal.Notify(sig, syscall.SIGINT, syscall.SIGUSR1, syscall.SIGUSR2) go func() { for s := range sig { switch s { case syscall.SIGINT: os.Exit(1) case syscall.SIGUSR1, syscall.SIGUSR2: fmt.Println(s, ": reload config.") } } }() fmt.Println(os.Getpid()) select {} } /* 1285 user defined signal 1 : reload config. kill -s USR1 1285 user defined signal 2 : reload config. kill -s USR2 1285 */
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论