сигналы
This commit is contained in:
parent
653625e88a
commit
c232a309a6
@ -70,5 +70,5 @@ HTTP клиенты (HTTP Clients)
|
||||
HTTP серверы (HTTP Servers)
|
||||
Порождающие процессы (Spawning Processes)
|
||||
Исполняющие процессы (Exec'ing Processes)
|
||||
Signals
|
||||
Сигналы (Signals)
|
||||
Exit
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user