Linux - 信號

一.信號的基本概念

1.概念:信號其實通俗的來說就是操作系統與進程之間某些事件發生的一種通知機制。
2.信號的產生由隨機性------異步。
3.要能夠識別信號的前提條件是你認識信號。
4.在信號還沒有產生的時候,其實你也知道它該怎樣處理,你是識別它的。
5.我們爲什麼能夠識別信號,因爲大部分場景,我們都是見過的,其實就是大部分信號我們都是認識的。
6.信號是給進程發送的,進程想要處理信號就必須首先要識別信號。
7.進程接收信號之後,不是要馬上就處理信號,而是先把信號記錄下來,等到合適的時候處理。
8.進程是怎樣記錄信號,並識別它?
1)信號一共有62個,但是平常的話就只學前31個
2)宏是大寫的,但是在計算機中就是數字。
3)進程的PCB中必須要維護一個位圖,比特位的位置代表信號的編碼,比特位的內容代表的是有還是沒有。收到信號的時候,進程中的PCB檢測自己的位圖列表,然後通過比特位將0置爲1。
4)產生信號的方式有很多種,但是執行的話只能通過操作系統。(操作系統是進程的管理者)
5)操作系統向進程發送信號的過程:
先找到進程的PCB,然後找到它的位圖,根據信號的編碼將對應的比特位由0置爲1。
6)操作系統發信號的這個說法並不準確,應該是操作系統寫信號,修改信號的比特位。

二.信號產生的一般方式

1.用戶輸入命令,在shell下啓動一個前臺進程
用戶按"ctrl ^c"這個鍵盤輸入產生一個硬件中斷,被操作系統(OS)獲取,解釋爲信號,發送給目標前臺進程,前臺進程因爲受到信號,進而引起進程的退出。(ctrl ^c是二號信號)
進程收到信號之後有三種處理方式:
1)忽略此信號
2)執行此信號的默認處理動作。
3)提供一個信號處理函數,要求內核在處理該信號時切換到用戶態執行這個處理函數。這種方式稱作捕捉一個信號。(Catch)
處理信號的第三種方式有一個函數signal-------用來自定義和捕捉的

typedef	void(* sighandler_t)(int);
sighandler_t	signal	(int	signum,	sighandler_t	handler)
signal函數有兩個參數:一個是int,一個是sighandler_t ,返回值也是sighandler_t ,
該指針指向一個參數爲int,無返回值的函數。第一個參數是信號的編號,第二個參數是信號的處理方法。
修改信號的默認行爲
//自定義捕捉信號
#include<iostream>
#include<signal.h>
#include<unistd.h>
void handler(int signo)
{
	printf("catch sig,signo : %d\n",signo);
	exit(1);
}

int main()
{
	int i = 1;
	while(i <= 31)
	{
		signal(i,handler);
		i++;
	}
	while(1)
	{
		printf("hello world\n");
		sleep(1);
	}
}

//18 19號信號不會被修改。9號信號非常的強勢,它的性能依然存在。
//忽略信號 ---- SIG_IGN

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章