¿Es posible capturar una señal Ctrl+C (SIGINT) y ejecutar una función de limpieza, de forma "diferida"?
Quiero capturar la señal Ctrl+ C( SIGINT
) enviada desde la consola e imprimir algunos totales parciales.
Aceptado
Puede utilizar el paquete os/signal para manejar las señales entrantes. Ctrl+ Ces SIGINT , por lo que puedes usarlo para atrapar os.Interrupt
.
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
go func(){
for sig := range c {
// sig is a ^C, handle it
}
}()
La forma en que usted hace que su programa finalice e imprima información depende totalmente de usted.
Esto funciona:
package main
import (
"fmt"
"os"
"os/signal"
"syscall"
"time" // or "runtime"
)
func cleanup() {
fmt.Println("cleanup")
}
func main() {
c := make(chan os.Signal)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
<-c
cleanup()
os.Exit(1)
}()
for {
fmt.Println("sleeping...")
time.Sleep(10 * time.Second) // or runtime.Gosched() or similar per @misterbee
}
}
Pagar en el patio de juegos