如何在go程式中捕獲退出訊號

2021-07-24 23:46:15 字數 1327 閱讀 1354

linux環境中除了程式本身執行結束退出外,還有很多其他的退出方式,比如我們在shell裡面直接執行命令kill或者kill -9.僅僅是多了乙個-9引數就屬於不同的退出方式了,因為他們將會給程式傳送不同的訊號量.

當我們執行kill的時候,預設傳送sigterm訊號到程式中,當程式接收到這個訊號的時候,可能會出現以下集中方式:

退出程式

執行一些清理操作後退出

忽略掉,繼續執行

這三種方式都是程式中可以通過**直接實現的,比較好的執行方式就是通過第二種進行一些資源的清理後再去退出,而有些程式則不會像我們想象的那樣執行退出操作,所以管理員一旦發現這種情況,往往會執行更加直接的方式,傳送乙個-9引數的訊號到程式中,也就是sigkill訊號,這個訊號是不能被直接忽略的,他會導致整個系統的init程式停止這個程序的執行,程序直接退出,而不會有任何的機會去意識到這個行為的發生.

另外一種就是我們對於前台執行的程式的終止,我們一般會執行乙個ctrl-c來退出程式的執行,這個組合鍵會傳送給程式乙個sigint指令,該指令也可以在程式中捕獲,所以我們知道了應該捕獲什麼樣的訊號指令來進行預定義的退出環節.

下面我們使用的**就是利用了signal.notify函式來繫結兩種訊號到管道中,一旦接收到該訊號就傳遞他們到channel中,另外我們還有乙個專門的goroutine來消費這個channel的資料,預設情況下阻塞在第一條語句,一旦有訊號傳遞進來,執行清理,並退出系統.**如下:

package main

import (

"log"

"os"

"os/signal"

"sync"

"syscall"

"time"

)func main() ,1)

signalchan := make(chan os.signal,1)

gofunc() {}

os.exit(0)

}()signal.notify(signalchan, syscall.sigint, syscall.sigterm)

//模擬乙個持續執行的程序

time.sleep(10 * time.second)

}

詳解如何在 docker 容器中捕獲訊號

訊號 linux 訊號是一種程序間通訊的形式。乙個訊號就是核心傳送給程序的乙個訊息,告訴程序發生了某種事件。當乙個訊號被傳送給乙個程序後,程序會立即中斷當前的執行流並開始執行訊號的處理程式。如果沒有為這個訊號指定處理程式,就執行預設的處理程式。程序需要為自己感興趣的訊號註冊處理程式,比如為了能讓程式...

如何在程式內退出iPhone程式

如何在程式內退出iphone程式 不過呢。領導們,總是有那麼一些奇奇怪怪的需求,希望程式設計師可以讓程式退出。程式設計師呢,總是可以解決,那麼我們的方式就是呼叫exit 0 了。不過這時退出程式的樣子看起來非常的像程式崩潰,瞬間黑屏了,而且有概率性的失敗,反正我是有遇到過。鑑於這樣退出的方式非常的不...

如何在程式內退出iPhone程式

如何在程式內退出iphone程式 不過呢。領導們,總是有那麼一些奇奇怪怪的需求,希望程式設計師可以讓程式退出。程式設計師呢,總是可以解決,那麼我們的方式就是呼叫exit 0 了。不過這時退出程式的樣子看起來非常的像程式崩潰,瞬間黑屏了,而且有概率性的失敗,反正我是有遇到過。鑑於這樣退出的方式非常的不...