进程信号

进程信号:
    信号实际就是一个软中断
    信号更多的是通知时间的发生,信号产生之后第一时间也不是直接处理而是先存储下来
    Linux下有62种信号使用kill -l命令查看
    信号分了两类信号:1-31不可靠信号(非实时信号)
                     34-64可靠信号(实时信号)
    处理信号的产生->信号的注册->(信号的阻塞)信号的注销->信号的处理
   信号的产生:
      通过硬件中断产生   ctrl+c
      程序异常    SIGFPE  SIGSEGV 常出现的错误
      软件条件
        核心转储(code dump):
          保存当前程序运行的调用栈信息,用于错误调试。
          如果程序运行出现错误可以直接通过code文件来进行gdb调试(有些错误可能是偶然发生的)
          code dump默认关闭:隐私安全/资源占用
          code dump打开:ulimit -c 1024
   信号的注册:
      信号的注册/给一个进程发送信息,就是修改这个进程pcb关于信号的pending位图,将相应的信号位置1。
   信号的阻塞:
      信号的递达:信号的处理
      暂时不处理信号(阻止信号的递达),而并不是不接受信号
      要阻塞一个信号,那么就是修改PCB中关于信号的Block位图,将相应的信号位置1,这个位图就想是一个备注,说明如果接受到这个信号暂时不处理。
      信号未决:这是一种状态,信号从注册成功到信号递达之间的一种状态。
      sigprocmask();
      有两个信号是不会被阻塞的:SIGKILL SIGSTOP
      sigpending 获取未决信号
   信号的注销:
      就是从pending集合中将即要处理的信号相应位置0(从pcb的pending集合中移除)
      非可靠信号注册就是将相应pending置1,然后添加一个sigqueue结构到链表中,之后如果有相同信号到来,一看位图已经置一了,
      就不作操作了,意味着后来的信号在前一个信号位处理之前不会重复注册,代表丢了!!
      可靠信号就是不管有没有注册都要置1,并且添加节点到链表中,所以不会丢信号
      
      非可靠信号注销就是删除链表节点,相应位图置0
      可靠信号注销是删除节点,判断还是否有相同信号节点,如果没有位图置0,如果有就不置0
      struct sigqueue
   信号的处理:
      默认操作--按照操作系统对信号时间的既定处理方式
      忽略操作--直接将信号丢掉
      自定义处理--用户自己定义事件的处理方式
      typedef void (*sighandler_t)(int);
      sighandler_t signal(int signum, sighandler_t handler);
       signum :信号的编号
       handler : 处理方式
           SIG_IGN   忽略
           SIG_DFL   默认
  信号的捕捉: 主要是针对信号的自定义处理方式
      信号不是立即处理的,而是选择一个合适的时机去处理,合适的时机就是切换到当前程序从内核态切换到用户态的时候。
      信号是当我们发起系统调用/程序异常/中断当前程序从用户态运行切换到内核态,去处理这些事情,处理完毕之后,要从内核态返回用户态
    但是在返回之前会看一下是否有信号需要被处理,如果有,就处理信号(切换到用户态执行信号的自定义处理方式),处理完毕之后返回内核态
    判断如果没有信号要处理了就调用sys_sigreturn返回用户态(我们程序之前运行的位置)
      因为signal这个接口有linux版本的差异性,因此都喜欢使用sigaction这个接口来代替signal函数,他的功能也是自定义信号的处理方式
 可重入函数/不可重入函数
    不可重入函数:如果函数在不同的地方/时序进行调用,会对函数的功能逻辑造成影响,这种函数就称之为不可重入函数。
    可重入函数:不管怎么调用,都对函数内部功能/程序逻辑不造成影响,这种函数就是可重入函数。
    不可重入函数的一些要点(一般什么函数是不可重入函数):
        函数内部包含有全局性变量的修改操作。
        函数传参的参数跟其他地方公用使用同一变量
        因为这些对全局变  量的操作不是原子性的,因此这些修改操作有可能在不同地方进行修改
        一个函数中:
           1.是否对全局性的数据进行修改操作。
           2.这个操作是否原子性的。 
 volatile关键字:用于修饰变量
      保持内存可见性
      一个变量数据被CPU进行处理,每次都要重新从内存中获取变量的数据
      如果写高性能程序需要对程序进行编译优化,那么我们就必须要对一些敏感的变量进行内存可见性的修饰。
 SIGCHLD -17号信号:
     操作系统如何通知父进程说子进程退出尼?
     以前没有学信号,因此我们避免产生僵尸进程进程,只能让父进程一直等待子进程的退出(因为实在是不知道子进程到底什么时候退出)
     ,浪费父进程资源
     现在学了信号完全可以这样做:
       自定义信号:SIGCHLD的处理方式,相当于提前告诉进程,当接受到这个信号的时候使用waitpid,这样就不用一直等了。       

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值