*信号*:信息的载体
1、信号:1.简单 2.不能携带大量信息 3.满足某个特设条件才发送
2、信号的机制:信号通过软件手段实现的,导致某些信号会产生延迟性,但对于用户来说不易察觉。每个进程收到的信号都是由内核负责发送和内核负责处理
3、与信号相关的事件和状态:
1)产生信号:
按键产生:
Ctrl+c--------->2)SIGINT(终止/中断)
Ctrl+z---------->20) SIGTSTOP (暂停/停止) T----Teminal终端
Ctrl+\----------->3) SIGQUIT(退出)
系统调用产生:
kill----->SIGKILL
raise----->给当前进程发送指定信号(自己给自己发)
ay------->给自己发异常终止信号 6)SIGABRT信号,终止并产生Core 文件
软件条件产生:
定时器alarm,每个进程有且仅有一个定时器------->SIGALRM 默认终止
定时与进程状态无关(自然定时法):无论进程处于任何状态,定时都继续
settimer函数:精度us,可以实现周期性定时
硬件异常产生:
非法访问内存(段错误)------>11)SIGSEGV(段错误)
除0(浮点数除外)------>8)SIGFP(浮点数例外)
内存对齐出错(总线错误)-------->7)SIGBUS
命令产生:kill命令--->SIGKILL
2)递达:递达并且到达进程
3)未决:产生和递达之间的状态。主要由于阻塞(屏蔽)导致该状态
阻塞信号集(系统屏蔽字):
未决信号集:
4)信号处理方式:
执行默认动作、忽略(丢弃)(处理的方式就是丢弃)、捕捉(调用户处理函数)
5)信号四要素
编号、名称、事件、默认处理动作
默认处理动作:Term:终止进程 Ign:忽略信号 Core:终止进程,生成Core文件(查验死亡原因,用于GDB调试) Stop:停止(暂停)进程 Cont:继续运行进程
9号:SIGKILL和19号:SIGSTOP不允许忽略和捕捉,只能执行默认动作
6)信号集操作函数
a、信号集设定
sigset_t set; unsigned long的一种封装
int sigemptyset(sigset_t * set);//清0集合
int sigfillset(sigset_t* set)//全部置1
int sigaddset(sigset_t* set,int signum)//将某个信号加入到信号集
int sigdelset(sigset_t* set,int signum)//将某个信号删除
int sigismember(const sigset_t *set,int signum)//判断信号是否在集合中
sigprcmask:用来屏蔽信号和解除屏蔽
sigpending:读未决信号集
sighandler_t signal(int signum, sighandler_t handler);:注册捕捉信号
typedef void (*sighandler_t)(int);参数为int 类型的函数指针
sigaction:注册捕捉信号