сигналы

This commit is contained in:
badkaktus 2019-10-12 22:01:03 +03:00
parent 653625e88a
commit c232a309a6
3 changed files with 27 additions and 23 deletions

View File

@ -70,5 +70,5 @@ HTTP клиенты (HTTP Clients)
HTTP серверы (HTTP Servers)
Порождающие процессы (Spawning Processes)
Исполняющие процессы (Exec'ing Processes)
Signals
Сигналы (Signals)
Exit

View File

@ -1,9 +1,10 @@
// Sometimes we'd like our Go programs to intelligently
// handle [Unix signals](http://en.wikipedia.org/wiki/Unix_signal).
// For example, we might want a server to gracefully
// shutdown when it receives a `SIGTERM`, or a command-line
// tool to stop processing input if it receives a `SIGINT`.
// Here's how to handle signals in Go with channels.
// Иногда нам хотелось бы, чтобы наши программы на Go
// интеллектуально обрабатывали [сигналы Unix](http://en.wikipedia.org/wiki/Unix_signal).
// Например, мы можем захотеть, чтобы сервер корректно
// завершил работу при получении `SIGTERM`, или инструмент
// командной строки остановил обработку ввода, если он
// получил `SIGINT`. Вот как обрабатывать сигналы в Go
// с каналами.
package main
@ -16,20 +17,21 @@ import (
func main() {
// Go signal notification works by sending `os.Signal`
// values on a channel. We'll create a channel to
// receive these notifications (we'll also make one to
// notify us when the program can exit).
// Уведомление о выходе сигнала работает путем
// отправки значений `os.Signal` в канал. Мы создадим
// канал для получения этих уведомлений (мы также
// создадим канал, чтобы уведомить нас, когда программа
// может выйти).
sigs := make(chan os.Signal, 1)
done := make(chan bool, 1)
// `signal.Notify` registers the given channel to
// receive notifications of the specified signals.
// `signal.Notify` регистрирует данный канал для
// получения уведомлений об указанных сигналах.
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
// This goroutine executes a blocking receive for
// signals. When it gets one it'll print it out
// and then notify the program that it can finish.
// Эта горутина выполняет блокировку приема сигналов.
// Когда она получит его, то распечатает его, а
// затем уведомит программу, что она может быть завершена.
go func() {
sig := <-sigs
fmt.Println()
@ -37,9 +39,10 @@ func main() {
done <- true
}()
// The program will wait here until it gets the
// expected signal (as indicated by the goroutine
// above sending a value on `done`) and then exit.
// Программа будет ждать здесь, пока не получит
// ожидаемый сигнал (как указано в приведенной
// выше процедуре, отправляющей значение в `done`),
// и затем завершится.
fmt.Println("awaiting signal")
<-done
fmt.Println("exiting")

View File

@ -1,7 +1,8 @@
# When we run this program it will block waiting for a
# signal. By typing `ctrl-C` (which the
# terminal shows as `^C`) we can send a `SIGINT` signal,
# causing the program to print `interrupt` and then exit.
# Когда мы запустим эту программу, она заблокирует
# ожидание сигнала. Набрав `ctrl-C` (который терминал
# показывает как `^C`), мы можем послать сигнал `SIGINT`,
# в результате чего программа напечатает `interrupt`
# и затем выйдет.
$ go run signals.go
awaiting signal
^C