Функция signal.Notify
Функция signal.Notify позволяет программе получать уведомления
о поступлении системных сигналов. В первый параметр она принимает
канал, в который будут отправляться полученные сигналы, а во второй
параметр принимает один или несколько сигналов, которые необходимо
перехватывать. Если второй параметр не указан, функция перехватывает
все сигналы, которые не приводят к завершению программы.
Синтаксис
signal.Notify(c, sigs...)
Пример sect
Давайте создадим программу, которая перехватывает сигнал
SIGINT (генерируется при нажатии Ctrl+C):
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT)
fmt.Println("Waiting for SIGINT (Ctrl+C)...")
sig := <-sigCh
fmt.Printf("Received signal: %s\n", sig)
}
Результат выполнения кода (при нажатии Ctrl+C):
"Waiting for SIGINT (Ctrl+C)..."
"Received signal: interrupt"
Пример sect
Давайте перехватим несколько сигналов одновременно:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("Waiting for SIGINT or SIGTERM...")
sig := <-sigCh
fmt.Printf("Received signal: %s\n", sig)
}
Результат выполнения кода (при отправке SIGTERM):
"Waiting for SIGINT or SIGTERM..."
"Received signal: terminated"
Пример sect
Давайте создадим программу, которая корректно завершает работу при получении сигнала:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("Program is running. Press Ctrl+C to stop.")
go func() {
<-sigCh
fmt.Println("\nShutting down gracefully...")
os.Exit(0)
}()
// Бесконечный цикл для имитации работы
select {}
}
Результат выполнения кода (при нажатии Ctrl+C):
"Program is running. Press Ctrl+C to stop."
"\nShutting down gracefully..."
Смотрите также
-
функцию
signal.Stop,
которая останавливает перехват сигналов для канала -
функцию
signal.Ignore,
которая игнорирует указанные сигналы -
функцию
signal.Reset,
которая сбрасывает обработку сигналов к стандартному поведению -
функцию
signal.NotifyContext,
которая создает контекст, отменяемый при получении сигнала