Функция signal.Stop
Функция signal.Stop отменяет ранее установленную обработку сигналов
для переданного ей канала. Она принимает один параметр - канал типа
chan<- os.Signal, который был ранее передан в функцию
signal.Notify. После вызова signal.Stop, сигналы перестают
поступать в этот канал. Если в канале уже есть ожидающие сигналы,
они остаются в буфере, но новые сигналы больше не будут отправляться.
Синтаксис
signal.Stop(c chan<- os.Signal)
Где c - канал для приема сигналов.
Пример
Давайте создадим канал для приема сигналов и зарегистрируем
обработку сигнала os.Interrupt:
package main
import (
"fmt"
"os"
"os/signal"
"time"
)
func main() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt)
go func() {
<-sigChan
fmt.Println("received interrupt")
}()
time.Sleep(2 * time.Second)
fmt.Println("stopping signal notification")
signal.Stop(sigChan)
time.Sleep(2 * time.Second)
fmt.Println("program finished")
}
Результат выполнения кода:
"stopping signal notification"
"program finished"
В этом примере обработка сигнала была остановлена до того, как сигнал был отправлен, поэтому сообщение "received interrupt" не было выведено.
Пример
Используем signal.Stop для остановки обработки
сигнала syscall.SIGTERM:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time"
)
func main() {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGTERM)
go func() {
sig := <-sigChan
fmt.Printf("received signal: %s\n", sig)
}()
fmt.Println("sending SIGTERM")
process, _ := os.FindProcess(os.Getpid())
_ = process.Signal(syscall.SIGTERM)
time.Sleep(100 * time.Millisecond)
fmt.Println("stopping signal notification")
signal.Stop(sigChan)
fmt.Println("sending SIGTERM again")
_ = process.Signal(syscall.SIGTERM)
time.Sleep(100 * time.Millisecond)
fmt.Println("program finished")
}
Результат выполнения кода:
"sending SIGTERM"
"received signal: terminated"
"stopping signal notification"
"sending SIGTERM again"
"program finished"
Первый сигнал SIGTERM был обработан, так как
обработка была активна. После вызова signal.Stop
второй сигнал не был доставлен в канал.
Смотрите также
-
функцию
signal.Notify,
которая настраивает доставку сигналов в канал -
функцию
signal.Ignore,
которая игнорирует указанные сигналы -
функцию
signal.Reset,
которая восстанавливает стандартную обработку сигналов -
функцию
signal.NotifyContext,
которая создает контекст, отменяемый при получении сигнала