go-signal


고언어에서 os signal 을 콘트롤 하는 방법을 찾아보았다.

package main                                            
                                                          
import (                                                  
    "fmt"                                                 
    "os"                                                  
    "os/signal"                                           
    "syscall"                                             
    "time"                                                
)                                                         
                                                          
func main() {                                             
                                                          
    // signal 채널을 만든다.                              
    signal_chan := make(chan os.Signal, 2)                
    signal.Notify(signal_chan, syscall.SIGINT) // ctrl+c  
                                                          
    // loop                                               
    isDone := false                                       
    for isDone != true {                                  
        // signal handler                                 
        select {                                          
        case sig := <-signal_chan:                        
            fmt.Println("signal!! ", sig)                 
            isDone = true                                 
        default:                                          
            isDone = false                                
        }                                                 
        time.Sleep(1)                                     
    }                                                     
}                                                         

채널을 통해서 signal을 전달하게 된다. 버퍼드채널과 select 를 이용하여 non-blocking 으로 구현하였다