信號Signal

1.信號的定義

操作系統向目標進程發送通知的過程。

2.信號的相關概念

①操作系統是進程的管理者,它會向進程發送信號;

②發送信號即修改目標進程PCB中的信號字段;

③進程的PCB中會有信號的信息,當進程看到這些信息時,就知道自己收到信號了;

④進程受到信號後,它知道如何處理,但不會立即處理,而是在合適的時間處理它;

⑤信號由編號和名稱組成,發送信號時兩者都可以使用;
這裏寫圖片描述

⑥ 一共有62個信號,1~31號爲普通信號,34~64爲實時信號;

⑦可以用比特位的位置表示信號的編號,內容表示是否收到信號(1表示收到,0表示未收到),如第二個比特位爲1,表示收到2號信號;

⑧信號可以在進程的任何生命週期產生;

3.前臺進程、後臺進程

(1)寫一個一直循環的程序signal1.c

 #include<stdio.h>

 int main()
 {
    while(1);
    return 0;
 }

(2)在前臺運行signal1後,輸入shell命令,不執行,當鍵盤輸入ctrl-c時,進程終止,即收到了終止信號—2號信號。

這裏寫圖片描述

(3)在後臺運行signal1後,輸入的shell命令可以執行,但此時不能再使用ctrl-c終止進程,可以使用 kill -9 進程號殺死進程。

這裏寫圖片描述

這裏寫圖片描述

(4)前臺進程的運行狀態爲R+,後臺進程的運行狀態爲R;

這裏寫圖片描述

4.信號產生的方式:

①硬件
如硬盤可以產生信號,但只能發送給前臺進程,如上面的ctrl-c終止了./signal1

②軟硬件異常產生信號
如一個除數爲0的進程,會發送8號信號表示異常;
如指針越界時,會發送11號信號表示異常;
操作系統將異常進程殺掉後,這個異常就不存在了;

③通過某些函數發送信號
如kill函數

5.處理信號的方式:

①忽略此信號;

②執行該信號的默認處理動作;

③提供一個信號處理函數,自定義捕捉信號;

6.有關捕捉信號的函數

sighandler_t signal( int signum , sighandler_t handler);
signum:信號編號或名稱;
handler:函數指針,自定義的處理方式;
9號信號不能被修改,屏蔽;

#include<stdio.h>
#include<unistd.h>
#include<signal.h>

void myhandler(int sig)
{
   printf("pid:%d,get a signal:%d",getpid(),sig);
}

int main()
{
   int i=1;
   for(i;i<=31;i++)
   {
       signal(i,myhandler);
   }
   printf("pid:%d,proc id running...\n",getpid());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章