Manejo de señales en os.signal golang

Cuando el programa se reinicia y otras operaciones, debemos permitir que el programa salga con gracia después de completar algunas tareas importantes. Golang nos proporciona el paquete de señales, que implementa el mecanismo de procesamiento de señales y permite que el programa Go interactúe con las señales entrantes.

Las funciones principales del paquete de señales en la biblioteca estándar del lenguaje Go incluyen principalmente los siguientes aspectos:

1. Gestión del estado global del procesamiento de señales.

El estado de procesamiento de cada señal se rastrea a través de la estructura del controlador, incluida la relación de mapeo entre señales y canales, y el recuento de referencia de cada señal.

2. Alta y baja del procesamiento de señales

La función Notificar se utiliza para registrar el procesamiento de señales en el canal especificado, lo que actualizará el estado de los controladores.

La función Detener se utiliza para cancelar el registro del procesamiento de señal del canal especificado y eliminarlo de los controladores.

La función Restablecer se utiliza para restablecer el manejo de la señal especificada al comportamiento predeterminado.

3. Captura y distribución de señales.

Cuando la función de proceso recibe una señal, se distribuirá a todos los canales registrados con la señal.

4. Recuperación del procesamiento de señales.

A través de la función de cancelación, se puede restaurar o ignorar el comportamiento predeterminado de la señal.

5. Soporte de notificación de señal de contexto

La función NotifyContext creará un contexto y cerrará automáticamente el procesamiento de la señal cuando finalice el contexto.

6. Manejar la sincronización del acceso concurrente de la señal.

El acceso seguro para subprocesos al estado global se garantiza mediante bloqueos de los controladores.

7. Algunas funciones de utilidad

Como la operación de máscara del controlador, juzgar si la señal está en la lista de ignorados, etc.

En general, la implementación rastrea la relación entre la señal y el canal a través de controladores y la distribuye a los canales interesados ​​cuando recibe una señal, proporcionando un mecanismo de procesamiento de señal flexible y eficiente.

En el uso real, necesitamos crear un canal que reciba semáforos y usar Notificar para registrar este canal. Cuando ocurre una señal, el canal puede recibir la señal y los servicios posteriores se pueden procesar de manera específica. como sigue:

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
	}
}

Hay 32 semáforos en total y las enumeraciones correspondientes se encuentran en el paquete syscall.

Los valores de señal comúnmente utilizados incluyen:

 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 结束程序(可以被捕获、阻塞或忽略)

En el marco go, la señal en realidad se usa en el proyecto para salir con gracia. Consulte: Cómo implementar la salida elegante del programa en go, análisis del código fuente de go-kratos

Supongo que te gusta

Origin blog.csdn.net/w_monster/article/details/131994289
Recomendado
Clasificación