Обработка сигналов в os.signal golang

Когда программа перезапускается и выполняет другие операции, нам нужно позволить программе корректно завершить работу после завершения некоторых важных задач.Golang предоставляет нам пакет сигналов для реализации механизма обработки сигналов и позволяет программе Go взаимодействовать с входящими сигналами.

Основные функции пакета сигналов в стандартной библиотеке языка Go в основном включают следующие аспекты:

1. Глобальное государственное управление обработкой сигналов

Статус обработки каждого сигнала отслеживается через структуру обработчиков, включая взаимосвязь между сигналами и каналами, а также счетчик ссылок каждого сигнала.

2. Регистрация и снятие с регистрации обработки сигналов.

Функция Notify используется для регистрации обработки сигнала на указанном канале, что обновит статус обработчиков.

Функция Stop используется для отмены регистрации обработки сигнала указанного канала и удаления его из обработчиков.

Функция Reset используется для сброса обработки указанного сигнала к поведению по умолчанию.

3. Захват и распространение сигналов

Когда функция процесса получает сигнал, он будет распространен по всем каналам, зарегистрированным в этом сигнале.

4. Восстановление обработки сигналов

С помощью функции отмены можно восстановить или игнорировать поведение сигнала по умолчанию.

5. Поддержка уведомлений о контекстных сигналах.

Функция NotifyContext создаст контекст и автоматически завершит обработку сигнала по завершении контекста.

6. Обеспечьте синхронизацию одновременного доступа к сигналам.

Потокобезопасный доступ к глобальному состоянию гарантируется блокировками обработчиков.

7. Некоторые служебные функции

Например, операция маски обработчика, оценка того, находится ли сигнал в списке игнорирования и т. д.

В целом реализация отслеживает взаимосвязь между сигналом и каналом через обработчики и распределяет данные по заинтересованным каналам при получении сигнала, обеспечивая гибкий и эффективный механизм обработки сигналов.

При фактическом использовании нам необходимо создать канал, который получает семафоры, и использовать Notify для регистрации этого канала.При возникновении сигнала канал может получить сигнал, а последующие услуги могут быть обработаны целевым образом. следующее:

package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

func main() {
    
    

	// 创建一个channel来接收SIGINT信号
	c := make(chan os.Signal)

	// 监听SIGINT信号并发送到c
	signal.Notify(c, syscall.SIGINT)

	// 使用一个无限循环来响应SIGINT信号
	for {
    
    
		fmt.Println("Waiting for SIGINT")
		<-c
		fmt.Println("Got SIGINT. Breaking...")
		break
	}
}

Всего имеется 32 семафора, и соответствующие перечисления находятся в пакете системных вызовов.

Обычно используемые значения сигналов включают в себя:

 SIGHUP 1 终端控制进程结束(终端连接断开)
 SIGINT 2 用户发送INTR字符(Ctrl+C)触发
 SIGQUIT 3 用户发送OUIT字符(Ctrl+/触发
 SIGKILL 9 无条件结束程序(不能被捕获、阻塞或忽略)
 SIGUSR1 10 用户保留
 SIGUSR2 12 用户保留
 SIGPIPE 13 消息管道损坏(FIFO/Socket通信时,管道未打开而进行写操作)
 SIGALRM 14 时钟定时信号
 SIGTERM 15 结束程序(可以被捕获、阻塞或忽略)

В фреймворке go сигнал фактически используется в проекте для корректного выхода.См.: Как реализовать корректный выход из программы в go, анализ исходного кода go-kratos.

Guess you like

Origin blog.csdn.net/w_monster/article/details/131994289