進程(cheng)間(jian)通(tong)信之(zhi)信號初體驗
							時間:2018-09-29      來源(yuan):未知 
							信號初體驗:
1.信(xin)號(hao)通信(xin)的理解
內核中有通信對(dui)(dui)象,前邊通信對(dui)(dui)象是管道(dao),這里是信號。
如果進(jin)程1想(xiang)與進(jin)程2通(tong)過信號通(tong)信,不能通(tong)過用戶空間(jian),它(ta)必須先告(gao)(gao)訴內核(he),讓內核(he)告(gao)(gao)訴進(jin)程2 如圖所示:
    
2.信號的(de)含(han)義(yi):
下面看內核(he)空間有多少種信號(hao) 可以通過kill 加個選項-l 可以看到內核(he)總共可以發送64種信號(hao):數字代表信號(hao)的(de)ID 后邊的(de)宏代表他(ta)(ta)的(de)功能,每個信號(hao)都有他(ta)(ta)的(de)意義(yi)。
 
查看每個信(xin)號的含義:
man 7 signal
SIGINT ctrl+c 發出的(de)信號
SIGQUIT ctrl+\ 終止程(cheng)序 產生內存映像文件
SIGILL 非法指(zhi)令
SIGABRT 通過(guo)abort函(han)數(shu)實現程序終止
SIGFPE 除(chu)數(shu)為0 就會產(chan)生這個(ge)信號 叫浮點異常
SIGKILL 必殺信號
SIGSEGV 段錯(cuo)誤
SIGPIPE 管道(dao)破裂
SIGALRM alarm是鬧鐘信號,用alarm()函數設(she)置鬧鐘,告訴系統時間到了(le),就會(hui)發送(song)
SIGTERM 終(zhong)止(zhi)信(xin)號 kill命(ming)令就是向進程發這個的(de)信(xin)號
SIGCHLD 子(zi)進程終止(zhi)或停止(zhi)的時候(hou) 會向父進程發此信號
SIGCONT 讓一個暫停的進程繼(ji)續(xu)
SIGSTOP 讓一個進(jin)程暫停(ting)
SIGTSTP 按(an)下CTRL+Z
3.關(guan)于信(xin)號的發送存(cun)在這兩個個問(wen)題(ti)
a.內核中很多信(xin)(xin)(xin)號(hao)(hao)(hao)(hao),比如進程1發送(song)信(xin)(xin)(xin)號(hao)(hao)(hao)(hao)給進程2,用戶(hu)空間發送(song)不(bu)了(le),用戶(hu)空間不(bu)具(ju)備(bei)發送(song)信(xin)(xin)(xin)號(hao)(hao)(hao)(hao)的(de)能(neng)力;進程1想讓內核發送(song)信(xin)(xin)(xin)號(hao)(hao)(hao)(hao)給進程2,必須告(gao)訴內核要發什么信(xin)(xin)(xin)號(hao)(hao)(hao)(hao),信(xin)(xin)(xin)號(hao)(hao)(hao)(hao)的(de)編號(hao)(hao)(hao)(hao)是什么。
b.用戶空間有很多進程,對于內(nei)核來(lai)講,到底給哪個進程發送信號?所(suo)以進程1要告訴內(nei)核發信號給應(ying)用層的哪個進程。
因此發(fa)送信號給指定進程需(xu)要(yao)兩個參數(shu):信號的編號和進程的編號。
4.實戰深入(ru)理(li)解
之前學過linux命令kill, kill 9 pid可以殺死指定進程(cheng),9就是編號為(wei)9的(de)信號,我們(men)寫(xie)個程(cheng)序完(wan)成之前的(de)kill 9操作。
第一步:先寫(xie)個”求死”進程。
linux@ubuntu:~$ vim test.c
linux@ubuntu:~$ gcc test.c
 
 
  
通過kill命(ming)令進(jin)(jin)入(ru)內(nei)核,kill命(ming)令其(qi)實也是(shi)應用(yong)程(cheng)(cheng)序。kill函數是(shi)系統調用(yong)函數,告訴內(nei)核發送(song)9號信號;第二個選項(xiang)是(shi)發送(song)pid,告訴內(nei)核,發給(gei)test.c進(jin)(jin)程(cheng)(cheng),test.c進(jin)(jin)程(cheng)(cheng)就(jiu)會收到這個信號。
這里我們總結下 kill函(han)數的形式:
kill(pid_t pid,int sig)
pid:整數,要(yao)接收信號的進(jin)程的進(jin)程號
  0 信號被發送(song)到所有和pid進(jin)程(cheng)在同一個進(jin)程(cheng)組的進(jin)程(cheng)
-1 信號發送給所有的進(jin)程表(biao)中的進(jin)程(除了進(jin)程號大的進(jin)程外)
sig:信號編號
第二步(bu):使用快捷鍵(jian) CTRL+ALT+T 再打(da)開(kai)一個(ge)終端 寫(xie)個(ge)kill函數,實現kill命(ming)令功能。
linux@ubuntu:~$ vim kill.c
linux@ubuntu:~$ gcc kill.c -o kill
 
linux@ubuntu:~$ ./kill 9 4245
切換(huan)終端 觀(guan)察(cha)之前的test.c進程
 
進(jin)程(cheng)4245,也(ye)就是test.c進(jin)程(cheng)已經被killed,實現的過程(cheng)為(wei)kill.c進(jin)程(cheng)發送(song)信(xin)號給內核(he)
內核收到(dao)信(xin)號(hao)9及進程(cheng)編號(hao)4245后 發信(xin)號(hao)給4245,進程(cheng)4245響(xiang)應信(xin)號(hao),執行默認(ren)的信(xin)號(hao)處理(li)方式,即殺死進程(cheng)。