代码拉取完成,页面将自动刷新
// 版权归GoFrame作者(https://goframe.org)所有。保留所有权利。
//
// 本源代码形式受MIT许可证条款约束。
// 如果未随本文件一同分发MIT许可证副本,
// 您可以在https://github.com/gogf/gf处获取。
// md5:a9832f33b234e3f3
package 进程类
import (
"context"
"gitee.com/go_888/goframe/internal/intlog"
gutil "gitee.com/go_888/goframe/util/gutil"
"os"
"os/signal"
"sync"
"syscall"
)
// X函数类型_SigHandler 定义了一个用于处理信号的函数类型。 md5:d7319108f37510cd
type X函数类型_SigHandler func(sig os.Signal)
var (
// 使用内部变量来保证当发生多个监听(Listen)时的并发安全。
// md5:7c2a9e90bd5be8da
listenOnce = sync.Once{}
waitChan = make(chan struct{})
signalChan = make(chan os.Signal, 1)
signalHandlerMu sync.Mutex
signalHandlerMap = make(map[os.Signal][]X函数类型_SigHandler)
shutdownSignalMap = map[os.Signal]struct{}{
syscall.SIGINT: {},
syscall.SIGQUIT: {},
syscall.SIGKILL: {},
syscall.SIGTERM: {},
syscall.SIGABRT: {},
}
)
func init() {
for sig := range shutdownSignalMap {
signalHandlerMap[sig] = make([]X函数类型_SigHandler, 0)
}
}
// X注册信号处理函数 为自定义的一个或多个信号添加自定义的信号处理器。 md5:996226c8d75ebdf5
func X注册信号处理函数(处理函数 X函数类型_SigHandler, 信号 ...os.Signal) {
signalHandlerMu.Lock()
defer signalHandlerMu.Unlock()
for _, sig := range 信号 {
signalHandlerMap[sig] = append(signalHandlerMap[sig], 处理函数)
}
notifySignals()
}
// X注册关闭信号处理函数 为关闭信号添加自定义信号处理器:
// - syscall.SIGINT(中断信号,通常由Ctrl+C触发)
// - syscall.SIGQUIT(退出信号,通常通过Ctrl+\触发)
// - syscall.SIGKILL(杀死信号,不可被捕获或忽略,用于强制终止进程)
// - syscall.SIGTERM(终止信号,用来请求程序正常退出)
// - syscall.SIGABRT(异常终止信号,通常由调用abort函数产生,用于指示严重错误)
// md5:6fd417c58f499e80
func X注册关闭信号处理函数(处理函数 ...X函数类型_SigHandler) {
signalHandlerMu.Lock()
defer signalHandlerMu.Unlock()
for _, h := range 处理函数 {
for sig := range shutdownSignalMap {
signalHandlerMap[sig] = append(signalHandlerMap[sig], h)
}
}
notifySignals()
}
// X监听信号 会阻塞并进行信号监听和处理。 md5:2425bc5d9026c36f
func X监听信号() {
listenOnce.Do(func() {
go listen()
})
<-waitChan
}
func listen() {
defer close(waitChan)
var (
ctx = context.Background()
wg = sync.WaitGroup{}
sig os.Signal
)
for {
sig = <-signalChan
intlog.Printf(ctx, `收到信号: %s`, sig.String())
if handlers := getHandlersBySignal(sig); len(handlers) > 0 {
for _, handler := range handlers {
wg.Add(1)
var (
currentHandler = handler
currentSig = sig
)
gutil.X异常捕捉并带异常处理(ctx, func(ctx context.Context) {
defer wg.Done()
currentHandler(currentSig)
}, func(ctx context.Context, exception error) {
intlog.Errorf(ctx, `执行信号处理程序失败: %+v`, exception)
})
}
}
// 如果它是退出信号,它将退出此信号监听。 md5:9b1cb86f40c5e361
if _, ok := shutdownSignalMap[sig]; ok {
intlog.Printf(
ctx,
`收到关闭信号 "%s",等待所有信号处理程序完成`,
sig.String(),
)
// 等待信号处理器完成。 md5:4d1ee13d17a0a193
wg.Wait()
intlog.Print(ctx, `所有信号处理程序已完成,退出进程`)
return
}
}
}
func notifySignals() {
var signals = make([]os.Signal, 0)
for s := range signalHandlerMap {
signals = append(signals, s)
}
signal.Notify(signalChan, signals...)
}
func getHandlersBySignal(sig os.Signal) []X函数类型_SigHandler {
signalHandlerMu.Lock()
defer signalHandlerMu.Unlock()
return signalHandlerMap[sig]
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。