信号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());
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章