第六章 信号和信号处理

信号和中断

  • 信号:发送给进程的请求,将进程从正常执行转移到中断处理

  • 中断:从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理

Unix/Linux信号示例

  • Ctrl+C:当前运行的进程终止。生成一个键盘硬件中断。键盘中断处理程序将"Ctrl+C"组合键转换为SIDINT(2)信号,发送给终端上的所有进程,并唤醒等待键盘输入的进程。

  • nohup a.out&:在后台运行一个程序,即使用户推出后,进程仍然继续执行。

  • kill pid (or kill -s 9 pid):用户再次登录时也许会发现(通过ps-u LTD)后台进程仍在运行。用户可以使用sh命令kill pid (or kill -s 9 pid)杀死该进程。

Unix/Linux中的信号处理

信号类型

#define	SIGHUP	1
#define	SIGINT	2
#define	SIGQUIT	3
#define	SIGILL	4
#define	SIGTRAP	5
#define	SIGABRT	6
#define	SIGIOT	6
#define	SIGBUS	7
#define	SIGFPE	8
#define	SIGKILL	9
#define	SIGUSR1	10
#define	SIGSEGV	11
#define	SIGUSR2	12
#define	SIGPIPE	13
#define	SIGALRM	14
#define	SIGTERM	15
#define	SIGSTKFLT 16
#define	SIGCHLD	17

#define	SIGCONT	18
#define	SIGSTOP	19
#define	SIGTSTP	20
#dpfine	STGTTTN	21
#define	SIGTTOU	22
#define	SIGURG	23
#define	SIGXCPU	24
#define	SIGXFSZ	25
#define	SIGVTALRM 26
#define	SIGPROF	27
#define	SIGWINCH 28
#define	SIGPOLL	29
#define	SIGPWR	30
#define	SIGSYS	31

信号的来源

  • 来自硬件中断的信号:在执行过程中,一些硬件中断被转换为信号发送给进程硬件信号示例。

  • 来自异常的信号:常见的陷阱信号有SIGFPE(8),表示浮点异常(除以0),最常见也是最可怕的时SIGSEGV(11),表示段错误。

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


信号处理函数

1.信号处理函数的注册:在编写程序时,可以使用操作系统提供的函数来注册信号处理函数。通常使用 signal 或 sigaction 等函数来注册信号处理函数。这允许您定义在接收特定信号时要执行的自定义处理逻辑。

2.内置信号:操作系统定义了一些标准信号,例如 SIGINT(通常由 Ctrl+C 生成)、SIGTERM(正常终止请求)和 SIGHUP(终端挂起或控制进程终止)。这些信号有固定的名称和含义。

3.信号处理函数的功能:信号处理函数可以执行各种操作,包括但不限于以下内容:

  • 保存程序状态或数据。
  • 清理资源或关闭文件。
  • 发出自定义日志消息。
  • 终止进程。
  • 重新加载配置文件。
  • 忽略信号。

4.信号处理函数的编写:通常,信号处理函数是用户编写的函数,它们必须符合特定的函数签名,以接受信号作为参数。

5.编写信号处理函数时,需要小心处理,以确保它们不会导致不稳定或不安全的行为。


安装信号捕捉函数

int r=signal(int signal_number,void *handler)
  • 用于注册信号处理函数,以便在程序接收到特定信号时执行特定的操作。

信号处理步骤

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

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

3.信号和唤醒:在Unix/Linux内核中有两种SLEEP进程;深度休眠进程和浅度休眠进程。


信号与异常

1.作为进程异常的统一处理方法:当进程遇到异常时,它会陷入内核模式,将陷阱原因 转换为信号编号,并将信号发送给自己。

2.在特殊情况下,它会让某个进程通过信号杀死另一个进程。


sigaction()的使用操作实践

捕捉操作实践

遇到的问题

苏格拉底挑战



posted on 2023-11-12 11:40  20211422王俊凯  阅读(3)  评论(0编辑  收藏  举报