Функция signal.Ignore

Функция signal.Ignore указывает программе игнорировать переданные ей системные сигналы. Первый параметр функции принимает один или несколько сигналов типа os.Signal, которые необходимо игнорировать. После вызова этой функции программа перестает реагировать на указанные сигналы, и они не обрабатываются обработчиками.

Синтаксис

gosignal.Ignore(sig ...os.Signal)

Пример

Давайте заставим программу игнорировать сигнал os.Interrupt (обычно отправляется при нажатии Ctrl+C):

gopackage main

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

func main() {
  signal.Ignore(os.Interrupt)
  fmt.Println("Program started, ignoring Ctrl+C")

  for {
    fmt.Println("Working...")
    time.Sleep(2 * time.Second)
  }
}

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

go"Program started, ignoring Ctrl+C"
"Working..."
"Working..."
"Working..."

Теперь при нажатии Ctrl+C программа продолжит работу, не завершаясь.

Пример

Давайте проигнорируем несколько сигналов: os.Interrupt и syscall.SIGTERM:

gopackage main

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

func main() {
  signal.Ignore(os.Interrupt, syscall.SIGTERM)
  fmt.Println("Program started, ignoring SIGINT and SIGTERM")

  for {
    fmt.Println("Running...")
    time.Sleep(2 * time.Second)
  }
}

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

go"Program started, ignoring SIGINT and SIGTERM"
"Running..."
"Running..."
"Running..."

Теперь программа игнорирует как сигнал прерывания (Ctrl+C), так и сигнал завершения.

Пример

Давайте проверим, что произойдет, если игнорировать сигналы, уже перехватываемые каналом:

gopackage main

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

func main() {
  sigChan := make(chan os.Signal, 1)
  signal.Notify(sigChan, os.Interrupt)

  signal.Ignore(os.Interrupt)
  fmt.Println("Program started, signal is ignored")

  select {
  case <-sigChan:
    fmt.Println("Signal received")
  case <-time.After(5 * time.Second):
    fmt.Println("No signal received")
  }
}

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

go"Program started, signal is ignored"
"No signal received"

Как видно из примера, после вызова signal.Ignore даже если сигнал ранее был настроен через signal.Notify, он перестает доставляться в канал.

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

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