2019-10-12 22:01:03 +03:00

50 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Иногда нам хотелось бы, чтобы наши программы на Go
// интеллектуально обрабатывали [сигналы Unix](http://en.wikipedia.org/wiki/Unix_signal).
// Например, мы можем захотеть, чтобы сервер корректно
// завершил работу при получении `SIGTERM`, или инструмент
// командной строки остановил обработку ввода, если он
// получил `SIGINT`. Вот как обрабатывать сигналы в Go
// с каналами.
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
)
func main() {
// Уведомление о выходе сигнала работает путем
// отправки значений `os.Signal` в канал. Мы создадим
// канал для получения этих уведомлений (мы также
// создадим канал, чтобы уведомить нас, когда программа
// может выйти).
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
// `signal.Notify` регистрирует данный канал для
// получения уведомлений об указанных сигналах.
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// Эта горутина выполняет блокировку приема сигналов.
// Когда она получит его, то распечатает его, а
// затем уведомит программу, что она может быть завершена.
go func() {
sig := <-sigs
fmt.Println()
fmt.Println(sig)
done <- true
}()
// Программа будет ждать здесь, пока не получит
// ожидаемый сигнал (как указано в приведенной
// выше процедуре, отправляющей значение в `done`),
// и затем завершится.
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")
}