Go程式如何安全退出(CTRL+C)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

http://m.oschina.net/blog/125853

如果是命令列程式需要退出, CTRL+C是最直接的方法.

C語言如何處理CTRL+C

CTRL+C會向命令列進程發送中斷訊號, 在C語言的<signal.h>中的signal函數可以註冊訊號的處理函數.

signal函數的簽名如下:

void (*signal(int sig, void (*func)(int)))(int);

比如, 我們要處理CTRL+C對應的SIGINT訊號:

#include <stdio.h>#include <stdlib.h>#include <signal.h>void sigHandle(int sig) {    switch(sig) {    case SIGINT:        printf("sigHandle: %d, SIGINT\n", sig);        break;    default:        printf("sigHandle: %d, OTHER\n", sig);        break;    }    exit(1);}int main() {    signal(SIGINT, sigHandle);    for(;;) {}    return 0;}

編譯並運行程式後會進入死迴圈, 按CTRL+C強制退出會看到以下的輸出:

sigHandle: 2, SIGINT

當然, 直接從進程管理殺死程式就沒辦法收到訊號的.

<signal.h>中除了signal函數, 還有一個raise函數用於產生訊號:

int raise(int sig);

我們在sigHandle截獲訊號之後如果想重新恢複訊號, 可以使用raise函數. 但是, 要注意不要導致無窮遞迴signal/raise調用.

Go語言如何處理CTRL+C

Go語言也有類似的函數signal.Notify(在os/signal包中), 可以過濾訊號.

這是signal.Notify內建的例子:

// Set up channel on which to send signal notifications.// We must use a buffered channel or risk missing the signal// if we're not ready to receive when the signal is sent.c := make(chan os.Signal, 1)signal.Notify(c, os.Interrupt, os.Kill)// Block until a signal is received.s := <-cfmt.Println("Got signal:", s)

signal.Notify會將使用者關注的訊號轉寄到通道c, 通道c不能是阻塞的. 如果通道是緩衝不足的話, 可能會丟失訊號. 如果我們不再次轉寄訊號, 設定為1個緩衝大小就可以了.

signal.Notify從第二個參數起是可變參數的, 用於指定要過濾的訊號. 
如果不指定第二個參數, 則預設是過濾全部的訊號.

訊號的定義一般在syscallsyscall包是系統相關的, 
不同的作業系統訊號可能有差異. 不過syscall.SIGINTsyscall.SIGKILL各個系統是一致的, 分別對應os.Interruptos.Kill.

下面是Go語言版完整的例子:

package mainimport (    "fmt"    "os"    "os/signal")func main() {    c := make(chan os.Signal, 1)    signal.Notify(c, os.Interrupt, os.Kill)    s := <-c    fmt.Println("Got signal:", s)}

go run signal.go運行後會進入死迴圈, 按CTRL+C強制退出會看到以下的輸出:

Got signal: interrupt

當然, 直接從進程管理殺死程式就沒辦法收到訊號的.

如果要恢複訊號, 調用s.Signal(). 如果要停止訊號的過濾, 調用signal.Stop(c).


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.