¿Es posible capturar una señal Ctrl+C (SIGINT) y ejecutar una función de limpieza, de forma "diferida"?

Resuelto Sebastián Grignoli asked hace 12 años • 11 respuestas

Quiero capturar la señal Ctrl+ C( SIGINT) enviada desde la consola e imprimir algunos totales parciales.

Sebastián Grignoli avatar Jun 30 '12 04:06 Sebastián Grignoli
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.

Lily Ballard avatar Jun 29 '2012 21:06 Lily Ballard

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

 avatar Aug 10 '2013 05:08