【Linux】进程信号

概念
信号是进程之间事件异步通知的一种方式,属于软中断。
信号处理常见方式

  1. 忽略此信号。
  2. 执行该信号的默认处理动作。
  3. 提供一个信号处理函数,要求内核在处理该信号时切换到用户态执行这个处理函数,这种方式称为捕捉 (Catch)一个信号。

产生信号

  • 通过终端按键产生信号
    SIGINT的默认处理动作是终止进程,SIGQUIT的默认处理动作是终止进程并且Core Dump。
  • 调用系统函数向进程发信号
  • 由软件条件产生信号
  • 硬件异常产生信号
  • 什么是Core Dump
    当一个进程要异常终止时,可以选择把进程的用户空间内存数据全部 保存到磁 盘上,文件名通常是core,这叫做Core Dump。进程异常终止通常是因为有Bug,比如非法内存访问导致段错误, 事后可以用调试器检查core文件以查清错误原因,这叫做Post-mortem Debug(事后调试)。一个进程允许 产生多大的core文件取决于进程的Resource Limit(这个信息保存 在PCB中)。默认是不允许产生core文件的, 因为core文件中可能包含用户密码等敏感信息,不安全。在开发调试阶段可以用ulimit命令改变这个限制,允许 产生core文件。

捕捉信号

  1. 内核如何实现信号的捕捉
    如果信号的处理动作是用户自定义函数,在信号递达时就调用这个函数,这称为捕捉信号。信号处理函数的代码是在用户空间的,处理过程比较复杂。
  2. sigaction
 #include  
 int sigaction(int signo, const struct sigaction *act, struct sigaction *oact); 

sigaction函数可以读取和修改与指定信号相关联的处理动作。调用成功则返回0,出错则返回- 1。signo 是指定信号的编号。若act指针非空,则根据act修改该信号的处理动作。若oact指针非 空,则通过oact传出该信号原来的处理动作。
act和oact指向sigaction结构体

信号其他相关常见概念

  • 实际执行信号的处理动作称为信号递达(Delivery) 。
  • 信号从产生到递达之间的状态,称为信号未决(Pending)。
  • 进程可以选择阻塞 (Block )某个信号。
  • 被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作。
  • 阻塞和忽略是不同的,只要信号被阻塞就不会递达,而忽略是在递达之后可选的一种处理动作。

你可能感兴趣的:(Linux)