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