Функция signal.Stop

Функция signal.Stop отменяет ранее установленную обработку сигналов для переданного ей канала. Она принимает один параметр - канал типа chan<- os.Signal, который был ранее передан в функцию signal.Notify. После вызова signal.Stop, сигналы перестают поступать в этот канал. Если в канале уже есть ожидающие сигналы, они остаются в буфере, но новые сигналы больше не будут отправляться.

Синтаксис

gosignal.Stop(c chan<- os.Signal)

Где c - канал для приема сигналов.

Пример

Давайте создадим канал для приема сигналов и зарегистрируем обработку сигнала os.Interrupt:

gopackage 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")
}

Результат выполнения кода:

go"stopping signal notification"
"program finished"

В этом примере обработка сигнала была остановлена до того, как сигнал был отправлен, поэтому сообщение "received interrupt" не было выведено.

Пример

Используем signal.Stop для остановки обработки сигнала syscall.SIGTERM:

gopackage 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")
}

Результат выполнения кода:

go"sending SIGTERM"
"received signal: terminated"
"stopping signal notification"
"sending SIGTERM again"
"program finished"

Первый сигнал SIGTERM был обработан, так как обработка была активна. После вызова signal.Stop второй сигнал не был доставлен в канал.

Смотрите также

  • функцию signal.Notify,
    которая настраивает доставку сигналов в канал
  • функцию signal.Ignore,
    которая игнорирует указанные сигналы
  • функцию signal.Reset,
    которая восстанавливает стандартную обработку сигналов
  • функцию signal.NotifyContext,
    которая создает контекст, отменяемый при получении сигнала