我們知道信號(hào)是進(jìn)程間通信的其中一種方法,當(dāng)然也可以是內(nèi)核給進(jìn)程發(fā)送的消息,注意信息只是告訴進(jìn)程發(fā)生了什么事件,而不會(huì)傳遞任何數(shù)據(jù)。
這是進(jìn)程這個(gè)概念設(shè)計(jì)時(shí)就考慮到的了,因?yàn)槲覀兿M刂七M(jìn)程,就像一個(gè)小孩我們想他按我們的想法做,前提就是他能夠接受信號(hào)并且理解信號(hào)的含義。
Linux中定義了很多信號(hào),不同的Unix-like系統(tǒng)也不一樣,我們可以通過下面的命令來查當(dāng)前系統(tǒng)支持的種類。
? kill -l
HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM URG STOP TSTP CONT CHLD TTIN TTOU IO XCPU XFSZ VTALRM PROF WINCH INFO USR1 USR2
其中1至31的信號(hào)為傳統(tǒng)UNIX支持的信號(hào),是不可靠信號(hào)(非實(shí)時(shí)的),32到63的信號(hào)是后來擴(kuò)充的,稱做可靠信號(hào)(實(shí)時(shí)信號(hào))。不可靠信號(hào)和可靠信號(hào)的區(qū)別在于前者不支持排隊(duì),可能會(huì)造成信號(hào)丟失,而后者不會(huì)。
簡(jiǎn)單介紹幾個(gè)我們最常用的,在命令行中止一個(gè)程序我們一般摁Ctrl+c,這就是發(fā)送SIGINT信號(hào),而使用kill命令呢?默認(rèn)是SIGTERM,加上-9參數(shù)才是SIGKILL。
import os/signal
siganl.Notify()
signal.Stop()
這是Go封裝的信號(hào)接口,我們可以以此實(shí)現(xiàn)一個(gè)簡(jiǎn)單的信號(hào)發(fā)送和處理程序。