【golang】信号捕捉和处理
来源:互联网 发布:视频剪辑软件推荐 编辑:程序博客网 时间:2024/04/28 18:19
捕捉和处理信号可以实现优雅start和restart等。golang的signal提供了相关的方法。这里是一个模板,目录结构:
├── sig│ └── sig.go└── test.go
先看如何调用:
1.new出一个对象
2.register信号与对应的处理函数
3.定义os.Signal类型的channel,调用signal.Notify
4.for+select循环,原有逻辑放在default分支中。
package main import ( . "./sig" "fmt" "os" "os/signal" "syscall" "time") var stopFlag_ bool func main() { sigHandler := SignalSetNew() sigHandler.Register(syscall.SIGQUIT, sigHandlerFunc) sigHandler.Register(syscall.SIGUSR1, sigHandlerFunc) sigHandler.Register(syscall.SIGUSR2, sigHandlerFunc) sigChan := make(chan os.Signal, 10) signal.Notify(sigChan) for true { select { case sig := <-sigChan: err := sigHandler.Handle(sig, nil) if err != nil { fmt.Printf("[ERROR] unknown signal received: %v\n", sig) os.Exit(1) } default: time.Sleep(time.Duration(3) * time.Second) } }} func sigHandlerFunc(s os.Signal, arg interface{}) { switch s { case syscall.SIGUSR1: // check fmt.Printf("stopping Status : %v\n", stopFlag_) case syscall.SIGUSR2: // run formerFlag := stopFlag_ stopFlag_ = false fmt.Printf("stopping Status changed from %v to %v\n", formerFlag, stopFlag_) case syscall.SIGQUIT: // stop formerFlag := stopFlag_ stopFlag_ = true fmt.Printf("stopping Status changed from %v to %v\n", formerFlag, stopFlag_) }}
sig包(sig/sig.go)的定义:
package sig import ( "fmt" "os") type SignalHandler func(s os.Signal, arg interface{}) type SignalSet struct { m map[os.Signal]SignalHandler} func SignalSetNew() *SignalSet { ss := new(SignalSet) ss.m = make(map[os.Signal]SignalHandler) return ss} func (set *SignalSet) Register(s os.Signal, handler SignalHandler) { if _, found := set.m[s]; !found { set.m[s] = handler }} func (set *SignalSet) Handle(sig os.Signal, arg interface{}) (err error) { if _, found := set.m[sig]; found { set.m[sig](sig, arg) return nil } else { return fmt.Errorf("No handler available for signal %v", sig) } panic("won't reach here")}
0 0
- 【golang】信号捕捉和处理
- 信号的捕捉和处理
- 阻塞信号和捕捉信号
- Golang中的信号处理
- 信号的捕捉和处理之signaction函数
- 第十三节.Shell日志处理和信号捕捉
- Linux信号捕捉及其处理
- 捕捉段错误信号信号处理程序
- sigaction 读取和修改与指定信号相关联的处理动作 捕捉信号ctr+c
- 【Golang】关于信号signal处理
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
- siginalExample.c(使用signal和sigaction函数捕捉和处理信号)
- shell捕捉信号,重定向信号处理函数
- //捕捉段错误信号的信号处理程序
- 信号和信号处理
- 信号捕捉
- Linux Signal及Golang中的信号处理
- Linux Signal及Golang中的信号处理
- Codeforces #302 Div1 简要题解
- XCode的一些调试技巧
- sql学习笔记(6)-----------sql函数(1)
- 枚举使用误区--iOS开发
- ios 数组赋值时取不到 数组赋值为空 奇葩问题
- 【golang】信号捕捉和处理
- Win32多窗口程序的创建
- Xcode导入静态库有时会出现莫名其妙的问题
- 单例传值(三个界面)
- 四十三、继承与派生:赋值兼容性规则
- 【STL源码剖析读书笔记】【第4章】序列式容器之heap和priority_queue
- jqgrid 4.8版本 Cannot read property 'decimalSeparator' of undefined 错误
- html css学习笔记-详解各种选择器
- 社説 20150516 財政健全化計画 成長頼みが過ぎては危うい