進程間通信之信號初體驗
時間:2018-09-29 來源:未知
信號初體驗:
1.信號通信的理解
內核中有通信對象,前邊通信對象是管道,這里是信號。
如果進程1想與進程2通過信號通信,不能通過用戶空間,它必須先告訴內核,讓內核告訴進程2 如圖所示:

2.信號的含義:
下面看內核空間有多少種信號 可以通過kill 加個選項-l 可以看到內核總共可以發送64種信號:數字代表信號的ID 后邊的宏代表他的功能,每個信號都有他的意義。

查看每個信號的含義:
man 7 signal
SIGINT ctrl+c 發出的信號
SIGQUIT ctrl+\ 終止程序 產生內存映像文件
SIGILL 非法指令
SIGABRT 通過abort函數實現程序終止
SIGFPE 除數為0 就會產生這個信號 叫浮點異常
SIGKILL 必殺信號
SIGSEGV 段錯誤
SIGPIPE 管道破裂
SIGALRM alarm是鬧鐘信號,用alarm()函數設置鬧鐘,告訴系統時間到了,就會發送
SIGTERM 終止信號 kill命令就是向進程發這個的信號
SIGCHLD 子進程終止或停止的時候 會向父進程發此信號
SIGCONT 讓一個暫停的進程繼續
SIGSTOP 讓一個進程暫停
SIGTSTP 按下CTRL+Z
3.關于信號的發送存在這兩個個問題
a.內核中很多信號,比如進程1發送信號給進程2,用戶空間發送不了,用戶空間不具備發送信號的能力;進程1想讓內核發送信號給進程2,必須告訴內核要發什么信號,信號的編號是什么。
b.用戶空間有很多進程,對于內核來講,到底給哪個進程發送信號?所以進程1要告訴內核發信號給應用層的哪個進程。
因此發送信號給指定進程需要兩個參數:信號的編號和進程的編號。
4.實戰深入理解
之前學過linux命令kill, kill 9 pid可以殺死指定進程,9就是編號為9的信號,我們寫個程序完成之前的kill 9操作。
第一步:先寫個”求死”進程。
linux@ubuntu:~$ vim test.c
linux@ubuntu:~$ gcc test.c


通過kill命令進入內核,kill命令其實也是應用程序。kill函數是系統調用函數,告訴內核發送9號信號;第二個選項是發送pid,告訴內核,發給test.c進程,test.c進程就會收到這個信號。
這里我們總結下 kill函數的形式:
kill(pid_t pid,int sig)
pid:整數,要接收信號的進程的進程號
0 信號被發送到所有和pid進程在同一個進程組的進程
-1 信號發送給所有的進程表中的進程(除了進程號大的進程外)
sig:信號編號
第二步:使用快捷鍵 CTRL+ALT+T 再打開一個終端 寫個kill函數,實現kill命令功能。
linux@ubuntu:~$ vim kill.c
linux@ubuntu:~$ gcc kill.c -o kill

linux@ubuntu:~$ ./kill 9 4245
切換終端 觀察之前的test.c進程

進程4245,也就是test.c進程已經被killed,實現的過程為kill.c進程發送信號給內核
內核收到信號9及進程編號4245后 發信號給4245,進程4245響應信號,執行默認的信號處理方式,即殺死進程。

