1. 程式人生 > >Linux Signal及Golang中的訊號處理

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會被呼叫,當然程序也可以設定忽略此訊號。
有兩種訊號不能被攔截和處理: SIGKILLSIGSTOP

當接收到訊號時,程序會根據訊號的響應動作執行相應的操作,訊號的響應動作有以下幾種:

  • 中止程序(Term)
  • 忽略訊號(Ign)
  • 中止程序並儲存記憶體資訊(Core)
  • 停止程序(Stop)
  • 繼續執行程序(Cont)

使用者可以通過signalsigaction函式修改訊號的響應動作(也就是常說的“註冊訊號”)。另外,在多執行緒中,各執行緒的訊號響應動作都是相同的,不能對某個執行緒設定獨立的響應動作。

訊號型別

個平臺的訊號定義或許有些不同。下面列出了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 SignalGolang訊號處理

http://colobu.com/2015/10/09/Linux-Signals/ 訊號(Signal)是Linux, 類Unix和其它POSIX相容的作業系統中用來程序間通訊的一種方式。一個訊號就是一個非同步的通知,傳送給某個程序,或者同進程的某個執行緒,告訴它

Linux terminalPuttybackspace鍵產生亂碼的解決方法

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和sigaction

Linux中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:

golangtcp 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)是多個字符的集合,字符集種類較多

golangAny類型使用空接口中類型查詢

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服務