Go: сигналы

Сигналы используют для прерывания выполнения программы и срабатывания определенных обработчиков. Если вы нажимаете комбинацию клавиш CTRL+C в терминале для остановки запущенной программы посылается сигнал INT. Обычно, при получении сигнала INT процесс убивается, но некоторые процессы могут перехватывать сигнал и игнорировать его или завершить выполняемые операции перед выходом.

В Go для работы с сигналами используетя пакет os/signal, в котором определена функция Notify, с помощью которой можно перехватить выбранные сигналы или все возможные. Пример использования Notify ниже

code>
package main


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


func handle(c chan os.Signal) {
  s := <-c // ожидание сигнала
  fmt.Println("Got signal:", s)
}

func main() {
  c := make(chan os.Signal, 1)
  signal.Notify(c, syscall.SIGUSR1)
  handle(c)
}

В данном примере функция Notify принимает на вход канал с и после получения сигнала USR1 помещает объект os.Signal в с, после чего можно произвести его обработку в процедуре handle. Некоторые программы в качестве реакции на этот сигнал выполняют перезагрузку конфигурационного файла. Notify позволяет привязать к одному каналу более чем один сигнал, это делается следующим образом.


signal.Notify(c, syscall.SIGUSR1, syscall.SIGINT)

В этом случае в канал будет помещаться сигналы USR1 и INT (нажатие CTRL+C).

Сигналов достаточно много. Для того чтобы канал был привязан ко всем существующим сигналам нужно вызвать Notify без передачи списка каналов


signal.Notify(c)

 

02.08.2018









 
архив

подписка