linux C信号

  • 信号的定义
信号只不过是一个标志信息,并不能携带大量数据,进程会从内核收到信号,并按照约定执行一段代码体(响应信号),再继续执行其他代码,实际上这样一来,信号是一种软中断
严格地说进程A不能直接给进程B发送信号,而是借助内核完成信号的发送,同样进程B也是通过内核完成对信号的处理
  • 信号四要素
  1. 编号
  2. 名称
  3. 事件
  4. 默认处理方式
linux 下 kill -l可以显示所有信号 其中1-31较为常用

输出结果:

  • 信号产生的方式
  1. 按键产生 ctrl+z,ctrl+\,ctrl+s
  2. 系统调用产生 kill raise abort
  3. 软件条件产生 alarm(定时器)
  4. 异常产生:例如段错误(非法内存访问),除0,内存对其错误(总线错误)
  5. 命令产生kill
  • 信号分类:
  1. 终止Term(例如:SIGHUP)
  2. 暂停Stop
  3. Core生成文件记录进程死掉的原因(例如:SIGSEGV)
  4. Ign忽略信号
  5. 恢复执行Cont
  • 信号的状态:递达(递送且到达)或未决(因为阻塞而暂时终止)
  • 不允许忽略和捕捉的信号SIGKILL SIGSTOP----例如对于病毒程序,必须杀掉其进程。而在这之前,病毒可能把其他信号都变成忽略或捕捉!
  • PCB包含了未决信号集和信号屏蔽字(阻塞信号集)
未决信号集和阻塞信号集从组织形式上看都是一组信号,我们不妨以1-32来标记每个不同的信号种类,以按下按键ctrl+c为例,如果按下按键后会发送信号2,那么两组信号可能经历的变化如下:

执行前:

未决信号集中的信号2,状态为0----也就是处于“已决”状态----(双重否定等于肯定假的未决----就是已决)

按下按键后:

未决信号集中的信号2,状态为1(但是如果阻塞信号集中信号标识为1,那么未决信号集中的信号2将保持状态为1)

目标进程收到信号后:

未决信号集中的信号2,转态又变为0

这一变化过程有个很雅的词叫做翻转

  • 信号的处理方式
  1. 执行默认动作
  2. 忽略(丢弃)
  3. 捕捉(用户处理函数)
原文地址:https://www.cnblogs.com/saintdingspage/p/12165913.html