linux C信号
- 信号的定义
信号只不过是一个标志信息,并不能携带大量数据,进程会从内核收到信号,并按照约定执行一段代码体(响应信号),再继续执行其他代码,实际上这样一来,信号是一种软中断
严格地说进程A不能直接给进程B发送信号,而是借助内核完成信号的发送,同样进程B也是通过内核完成对信号的处理
- 信号四要素
- 编号
- 名称
- 事件
- 默认处理方式
linux 下 kill -l可以显示所有信号 其中1-31较为常用
输出结果:
- 信号产生的方式
- 按键产生 ctrl+z,ctrl+\,ctrl+s
- 系统调用产生 kill raise abort
- 软件条件产生 alarm(定时器)
- 异常产生:例如段错误(非法内存访问),除0,内存对其错误(总线错误)
- 命令产生kill
- 信号分类:
- 终止Term(例如:SIGHUP)
- 暂停Stop
- Core生成文件记录进程死掉的原因(例如:SIGSEGV)
- Ign忽略信号
- 恢复执行Cont
- 信号的状态:递达(递送且到达)或未决(因为阻塞而暂时终止)
- 不允许忽略和捕捉的信号SIGKILL SIGSTOP----例如对于病毒程序,必须杀掉其进程。而在这之前,病毒可能把其他信号都变成忽略或捕捉!
- PCB包含了未决信号集和信号屏蔽字(阻塞信号集)
未决信号集和阻塞信号集从组织形式上看都是一组信号,我们不妨以1-32来标记每个不同的信号种类,以按下按键ctrl+c为例,如果按下按键后会发送信号2,那么两组信号可能经历的变化如下:
执行前:
未决信号集中的信号2,状态为0----也就是处于“已决”状态----(双重否定等于肯定假的未决----就是已决)
按下按键后:
未决信号集中的信号2,状态为1(但是如果阻塞信号集中信号标识为1,那么未决信号集中的信号2将保持状态为1)
目标进程收到信号后:
未决信号集中的信号2,转态又变为0
这一变化过程有个很雅的词叫做翻转
- 信号的处理方式
- 执行默认动作
- 忽略(丢弃)
- 捕捉(用户处理函数)