一、信号的概念:
信号机制是Linux最基本的通讯机制,它可以用来向一个或者多个进程发送异步事件信息,传送少量信息。信号是一个软件中断,并且是一个“软中断”(只是告诉有这样一个信号,但这个信号具体如何进行处理、什么时候处理,都是由进程决定的,所以是软中断)
二、信号的产生:
硬件产生:
“ctrl+c ”:2号信号;“ctrl+z”:20号信号;“ctrl+|”:3号信号
软件产生:
kill函数:
int kill(pid_t pid,int sig)
参数:
pid:要操作的进程号;sig:具体信号
给pid进程发送sig信号
eg:kill(getipd(),2)
raise函数
int raise(int sig)
参数:sig:具体信号类型
谁调用给谁发信号
三、信号的种类:
Linux系统中定义了一些列的信号类型,这些信号可以由内核或者系统中的其他具有设当权限的进程产生,对于收到信号的进程,其task_struct结构体中的signal属性的某一位置位,使用kill-l命令可以列出所有已经定义的信号:
非可靠信号:(非实时信号)
1~31 :可能会丢失信号
可靠信号:(实时信号)
34~64:一定不会丢失的信号
总共有62个信号。
四、信号的处理方式:
操作系统对信号的处理方式(man 7 signal中查看)
term、core、cont、ign、stop
默认的处理方式:SIG_DFL,操作系统当中已经定义好了信号的处理方式了
忽略处理方式为:SIG_IGN ,该信号为忽略处理(子进程退出时给父进程发送的信号SIGHLD,其处理方式为忽略处理,所以父进程忽略处理,没有回收其退出状态信息,导致子进程成为僵尸进程)
自定义的处理方式:程序员可以更改信号的处理方式,定义一个函数,当进程收到该信号时,调用自定义的函数
五、信号的注册:
概念:一个进程收到了一个信号,这个过程称之为注册,信号的注册和注销是两个独立的过程
内核中信号注册位图以及sigqueue队列的了解:
注册位图、sigqueue都是进程当中的内容,每一个进程都有自己独有的注册位图和sigque