Unix/Linux系统编程(信号和信号处理)

 

一.关于信号和中断

  1.信号机制别名软中断,在<signal.h>系统头文件中定义了一系列的信号编号,都对应着一个正整数量:

 

   进程在用户空间运行时, 都要用信号机制来检查是否有信号到达, 而一般的进程默认对应信号的处理都是killed, 除非使用signal(信号编号, 处理方式)函数来处理(所以别名软中断)。

  2.“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。“中断”一词可应用于任何“进程”,并不仅限于计算机中的CPU,例如:人员中段、进程中断、硬件中断、进程的陷阱错误导致自行中断等等

  3.信号和中断的相似点:

    (1)都采用了异步通信的方式.

​       同步就是排队, 信息一个接一个的处理, 异步就是插队

    (2)都是暂停当前的, 去执行对应的handle程序

    (3)都是处理完返回原来位置

    (4)对于信号和中断, 都是可以屏蔽的

  4.信号和中断的区别

    (1)中断有优先级, 信号没有

    (2)信号处理程序在用户态下运行的, 中断程序在核心态下运行的

    (3)中断响应是及时的, 当信号响应一般有延迟

二.Uinx/Linux信号示例与信号处理

  1.信号示例

    (1)按“Ctrl+C”组合键通常会导致当前运行的进程终止。

    (2)用户可使用nohup a.out & 命令在后台运行一个程序,即使在用户退出之后,进程仍将继续运行。nohup命令会使sh像往常一样复刻子进程来执行程序,但是子进程会忽略SIGHUP(1)信号。当用户退出时,sh会向与终端有关的所有进程发送一个SIGHUP信号。后台进程在接收到这一信号后,会忽略它继续运行。为防止后台进程使用终端进行I/O,后台进程通常会断开与终端的连接,使其完全不受任何面向终端信号的影响。

    (3)也许几天之后,用户再次登录时会发现后台进程仍在运行,可以使用sh命令:

      kill pid (or kill -s 9 pid)杀死该进程。

 

  2.信号处理

    (1)信号类型:Unix/Linux支持31种不同信号,每种信号在signal.h文件中都有定义

    (2)信号来源

      来自硬件中断的信号

        1)中断键(Ctrl+C):产生一个SIGINT(2)信号。

        2)间隔定时器:当它的时间到期时,会产生一个SIGALRM(14)、SIGVTALRM(26)或SIGPROF(27)信号。

        3)其他硬件错误,如总线错误、IO陷阱等。

      来自异常的信号:当用户模式下的进程遇到异常时,会陷入内核模式,生成一个信号,并发送给自己。

      来自其他进程的信号:进程可使用kill(pid,sig)系统调用向pid标识的目标进程发送信号。

三.信号处理步骤

  1.当某进程处于内核模式时,会检查信号并处理未完成的信号

  2.重置用户安装的信号捕捉函数:用户安装的陷阱相关信号捕捉函数用于处理用户代码中的陷阱错误。

  3.信号和唤醒:在Unix/Linux内核中有两种SLEEP进程;深度休眠进程和浅度休眠进程。前一种进程不可中断,而后一种进程可由信号中断。

 

posted @ 2022-10-26 16:51  遥鱼  阅读(121)  评论(0)    收藏  举报