Linux Signal及Golang中的訊號處理
http://colobu.com/2015/10/09/Linux-Signals/
訊號(Signal)是Linux, 類Unix和其它POSIX相容的作業系統中用來程序間通訊的一種方式。一個訊號就是一個非同步的通知,傳送給某個程序,或者同進程的某個執行緒,告訴它們某個事件發生了。
當訊號傳送到某個程序中時,作業系統會中斷該程序的正常流程,並進入相應的訊號處理函式執行操作,完成後再回到中斷的地方繼續執行。
如果目標程序先前註冊了某個訊號的處理程式(signal handler),則此處理程式會被呼叫,否則預設的處理程式被呼叫。
傳送訊號
kill 系統呼叫(system
call)可以用來發送一個特定的訊號給程序。
kill
raise 庫函式可以傳送特定的訊號給當前程序。
在Linux下執行man
kill
可以檢視此命令的介紹和用法。
The command kill sends the specified signal to the specified process or process group. If no signal is specified, the TERM signal is sent. The TERM signal will kill processes which do not catch this signal. For other processes, it may be necessary to use the KILL (9) signal, since this signal cannot be caught.
Most modern shells have a builtin kill function, with a usage rather similar to that of the command described here. The '-a' and '-p' options, and the possibility to specify pids by command name is a local extension.
If sig is 0, then no signal is sent, but error checking is still performed.
一些異常比如除以0或者 segmentation violation 相應的會產生SIGFPE
SIGSEGV
訊號,預設情況下導致core
dump和程式退出。核心在某些情況下發送訊號,比如在程序往一個已經關閉的管道寫資料時會產生
SIGPIPE
訊號。在程序的終端敲入特定的組合鍵也會導致系統傳送某個特定的訊號給此程序:
- Ctrl-C 傳送 INT signal (SIGINT),通常導致程序結束
- Ctrl-Z 傳送 TSTP signal (SIGTSTP); 通常導致程序掛起(suspend)
- Ctrl-\ 傳送 QUIT signal (SIGQUIT); 通常導致程序結束 和 dump core.
- Ctrl-T (不是所有的UNIX都支援) 傳送INFO signal (SIGINFO); 導致作業系統顯示此執行命令的資訊
kill
-9 pid
會發送 SIGKILL
訊號給程序。
處理訊號
Signal handler可以通過signal()
系統呼叫進行設定。如果沒有設定,預設的handler會被呼叫,當然程序也可以設定忽略此訊號。
有兩種訊號不能被攔截和處理: SIGKILL
和SIGSTOP
。
當接收到訊號時,程序會根據訊號的響應動作執行相應的操作,訊號的響應動作有以下幾種:
- 中止程序(Term)
- 忽略訊號(Ign)
- 中止程序並儲存記憶體資訊(Core)
- 停止程序(Stop)
- 繼續執行程序(Cont)
使用者可以通過signal
或sigaction
函式修改訊號的響應動作(也就是常說的“註冊訊號”)。另外,在多執行緒中,各執行緒的訊號響應動作都是相同的,不能對某個執行緒設定獨立的響應動作。
訊號型別
個平臺的訊號定義或許有些不同。下面列出了POSIX中定義的訊號。
Linux 使用34-64訊號用作實時系統中。
命令man
7 signal
提供了官方的訊號介紹。
在POSIX.1-1990標準中定義的訊號列表
訊號 | 值 | 動作 | 說明 |
---|---|---|---|
SIGHUP | 1 | Term | 終端控制程序結束(終端連線斷開) |
SIGINT | 2 | Term | 使用者傳送INTR字元(Ctrl+C)觸發 |
SIGQUIT | 3 | Core | 使用者傳送QUIT字元(Ctrl+/)觸發 |
SIGILL | 4 | Core | 非法指令(程式錯誤、試圖執行資料段、棧溢位等) |
SIGABRT | 6 | Core | 呼叫abort函式觸發 |
SIGFPE | 8 | Core | 算術執行錯誤(浮點運算錯誤、除數為零等) |
SIGKILL | 9 | Term | 無條件結束程式(不能被捕獲、阻塞或忽略) |
SIGSEGV | 11 | Core | 無效記憶體引用(試圖訪問不屬於自己的記憶體空間、對只讀記憶體空間進行寫操作) |
SIGPIPE | 13 | Term | 訊息管道損壞(FIFO/Socket通訊時,管道未開啟而進行寫操作) |
SIGALRM | 14 | Term | 時鐘定時訊號 |
SIGTERM | 15 | Term | 結束程式(可以被捕獲、阻塞或忽略) |
SIGUSR1 | 30,10,16 | Term | 使用者保留 |
SIGUSR2 | 31,12,17 | Term | 使用者保留 |
SIGCHLD | 20,17,18 | Ign | 子程序結束(由父程序接收) |
SIGCONT | 19,18,25 | Cont | 繼續執行已經停止的程序(不能被阻塞) |
SIGSTOP | 17,19,23 | Stop | 停止程序(不能被捕獲、阻塞或忽略) |
SIGTSTP | 18,20,24 | Stop | 停止程序(可以被捕獲、阻塞或忽略) |
SIGTTIN | 21,21,26 | Stop | 後臺程式從終端中讀取資料時觸發 |
SIGTTOU | 22,22,27 | Stop | 後臺程式向終端中寫資料時觸發 |
在SUSv2和POSIX.1-2001標準中的訊號列表:
訊號 | 值 | 動作 | 說明 |
---|---|---|---|
SIGTRAP | 5 | Core | Trap指令觸發(如斷點,在偵錯程式中使用) |
SIGBUS | 0,7,10 | Core | 非法地址(記憶體地址對齊錯誤) |
SIGPOLL | Term | Pollable event (Sys V). Synonym for SIGIO | |
SIGPROF | 27,27,29 | Term | 效能時鐘訊號(包含系統呼叫時間和程序佔用CPU的時間) |
SIGSYS | 12,31,12 | Core | 無效的系統呼叫(SVr4) |
SIGURG | 16,23,21 | Ign | 有緊急資料到達Socket(4.2BSD) |
SIGVTALRM | 26,26,28 | Term | 虛擬時鐘訊號(程序佔用CPU的時間)(4.2BSD) |
SIGXCPU | 24,24,30 | Core | 超過CPU時間資源限制(4.2BSD) |
SIGXFSZ | 25,25,31 | Core | 超過檔案大小資源限制(4.2BSD) |
Windows中沒有SIGUSR1,可以用SIGBREAK或者SIGINT代替。
Go中的Signal傳送和處理
有時候我們想在Go程式中處理Signal訊號,比如收到SIGTERM
訊號後優雅的關閉程式(參看下一節的應用)。
Go訊號通知機制可以通過往一個channel中傳送os.Signal
實現。
首先我們建立一個os.Signal channel,然後使用signal.Notify
註冊要接收的訊號。
12345678910111213141516171819202122232425262728293031323334353637 |
package mainimport "fmt"import "os"import "os/signal"import "syscall"func main() { // Go signal notification works by sending `os.Signal` // values on a channel. We'll create a channel to // receive these notifications (we'll also make one to // notify us when the program can exit). sigs := make(chan os.Signal, 1) done := make(chan bool, 1) // `signal.Notify` registers the given channel to // receive notifications of the specified signals. signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)
相關推薦Linux Signal及Golang中的訊號處理http://colobu.com/2015/10/09/Linux-Signals/ 訊號(Signal)是Linux, 類Unix和其它POSIX相容的作業系統中用來程序間通訊的一種方式。一個訊號就是一個非同步的通知,傳送給某個程序,或者同進程的某個執行緒,告訴它 Linux terminal及Putty中backspace鍵產生亂碼的解決方法Industry terminal definition conventions provide a smooth way for you to send commands from the remote management console--usually Special Administration 淺談Linux中的訊號處理機制(三)一晃眼,已經到9月底了,都來不及去感慨時間匆匆。最近常常會想明年的今天我將會在那裡幹著什麼樣的工作?對未來又是憧憬又是擔憂,壓力山大。無論如何現在還是踏踏實實的學習吧,能這樣安安靜靜學習的日子也不多了。不扯了,還是接著前面的寫吧。 SA_RESTART語義 在上篇提到過,SA_ 淺談Linux中的訊號處理機制(二)首先謝謝 @小堯弟 這位朋友對我昨天夜裡寫的一篇《淺談Linux中的訊號處理機制(一)》的指正,之前的題目我用的“淺析”一詞,給人一種要剖析核心的感覺。本人自知功力不夠,尚且不能對著Linux核心原始碼評頭論足。以後的路還很長,我還是一步一個腳印的慢慢走著吧,Linux核心這座山,我才剛剛抵達山腳 淺談Linux中的訊號處理機制(一)有好些日子沒有寫部落格了,自己想想還是不要荒廢了時間,寫點兒東西記錄自己的成長還是百利無一害的。今天是9月17號,暑假在某家遊戲公司實習了一段時間,做的事情是在Windows上用c++寫一些遊戲英雄技能的邏輯實現。雖然時間不算長,但是也算學了一點東西,對團隊專案開發流程也有了一個直觀的感受,專案裡c Golang中的訊號處理packagemain import"fmt" import"os" import"os/signal" import"syscall" funcmain() { // Go signal notification works by sending `os.Signal` // values on a linux訊號處理及libcurl的坑前言: 最近有個專案, 需要訪問第三方服務. 該服務是通過http的形式訪問的, 為了安全和加密, 對方提供了一個加密用的C/C++庫, 用於對引數進行處理. 鑑於此, 選用了C/C++語言, 以libcurl作為http類庫來編寫該服務模組. 這為後續的 Linux 多執行緒應用中如何編寫安全的訊號處理函式關於程式碼的可重入性,設計開發人員一般只考慮到執行緒安全,非同步訊號處理函式的安全卻往往被忽略。本文首先介紹如何編寫安全的非同步訊號處理函式;然後舉例說明在多執行緒應用中如何構建模型讓非同步訊號在指定的執行緒中以同步的方式處理。 Linux 多執行緒應用中編寫安全的訊號處 golang訊號處理及一個簡單例子實現golang訊號處理及一個例子實現 往往實際專案中,我們希望修改了配置檔案後,但又不重啟程序的情況下而讓它重新載入配置檔案,這時候就需要通過訊號傳遞來進行處理這一優雅過程: 最常用的幾個Term終端傳入訊號 操作說明 一個簡單的栗子實現 幾個T linux程序訊號處理函式signal和sigactionLinux中signal函式說明: NAME signal - ANSI C signal handling SYNOPSIS #include <signal.h> typedef void (*sighandler_ Linux程式退出時的訊號捕獲及處理#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #in 呼叫訊號處理程式被捕捉的訊號自動地加到程序的當前訊號遮蔽字中signal() sigpending()//當呼叫一個訊號處理程式時,被捕捉的訊號自動地加到程序的當前訊號遮蔽字中,阻止後來產生的這種訊號中斷改訊號處理程式。 //當從訊號處理程式返回時,自動恢復原來的遮蔽字 #include <stdio.h> linux signal訊號處理過程與機制--完全例項講解訊號是Linux程式設計中非常重要的部分,本文將詳細介紹訊號機制的基本概念、Linux對訊號機制的大致實現方法、如何使用訊號,以及有關訊號的幾個系統呼叫。 訊號機制是程序之間相互傳遞訊息的一種方法,訊號全稱為軟中斷訊號,也有人稱作軟中斷。從它的命名可以看出,它的實 【Linux相識相知】文本處理工具之grepegrepfgrep及正則表達式搜索字符串 變量 git cnblogs game home 表示 leg roo 常說Linux上有文本處理的三劍客,grep、sed和awk,本文就grep做出詳細的描述,並引出正則表達式。 grep NAME:打印模式匹配的行 SYNOPISIS: golang中tcp socket粘包問題和處理enc pack 獲取 人工 過程 reader 主動 exit ase 轉自:http://www.01happy.com/golang-tcp-socket-adhere/ 在用golang開發人工客服系統的時候碰到了粘包問題,那麽什麽是粘包呢?例如我們和客戶端約定數據 Linux學習之十一-Linux字符集及亂碼處理gin tails 讀取 文件 latin1 style ESS 自身 win Linux字符集及亂碼處理 1、字符(Character)是各種文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。字符集(Character set)是多個字符的集合,字符集種類較多 golang中Any類型使用及空接口中類型查詢ace 賦值 2.3 string 使用 println 接受 var 語句 golang中Any類型使用及類型查詢1.Any類型GO語言中任何對象實例都滿足空接口interface{},空接口可以接口任何值var v1 interface{} = 1 var v Hash(雜湊/雜湊)表中衝突處理及命中計算前言 本片部落格主要講的是雜湊表中簡單的衝突處理的方法,以及命中率計算。原理方面基本沒有講解,基本就講個方法,主要用於知識記錄以及幫助一些刷題玩家瀏覽。 簡而言之,不講技術,只講方法。 引言 寫這篇部落格的契機是在刷pat甲級題遇到了一道寫雜湊的題目,結果英文太次被欺負了。之後靠翻譯讀懂題 java 及 web中專案url處理http://blog.csdn.net/bbb695480667/article/details/53838321#comments http://www.cnblogs.com/hqlong/p/6078858.html http://www.cnblogs.com/fnz0 Linux檔案在系統中的傳輸,打包及壓縮相關命令一、Linux檔案在系統中的傳輸 scp的上傳和下載 上傳:scp file [email protected]:/dir 下載:scp [email protected]:/file dir 詳細截圖可在文章:Linux系統中ssh與sshd服務 |