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());
}