第六章 信号和信号处理
信号和中断
-
信号:发送给进程的请求,将进程从正常执行转移到中断处理
-
中断:从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()的使用操作实践
捕捉操作实践
遇到的问题
苏格拉底挑战