Linux系统编程 第6章学习笔记

信号和信号处理

信号和中断

“中断”是从1/0设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移 到中断处理。与发送给CPU的中断请求一样,“信号”是发送给进程的请求,将进程从正常执行转移到中断处理。

·人员中断

·进程中断

·硬件中断

·进程的陷阱错误

 

Unix/Linux信号示例

·按"Ctrl+C”组合键通常会导致当前运行的进程终止。

·用户可使用nohup a.out &命令在后台运行一个程序。即使在用户退出后,进程仍将继续运行。

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

 

Unix/Linux中的信号处理

信号类型:

Unix/Linux支持31种不同的信号,每种信号在signal.h文件中都有定义。

 

 

 

信号的来源:

·来自硬件中断的信号

·来自异常的信号

·来自其他进程的信号

信号处理函数:

 

 

 

安装信号捕捉函数

进程可使用系统调用:

int r = signal(int signal_numberr void *handler);

进程可使用信号调用

int r = kill(pid, signal_number);

向pid标识的另一个进程发送信号。Sh命令

kill -s signal_number pid

使用kill系统调用。

 

信号处理步骤

(1)当某进程处于内核模式时,会检査信号并处理未完成的信号,如果某信号有用户安装的捕捉函数,该进程会先清除信号,获取捕捉函数地址,对于大多数陷阱信号,则将已安装的捕捉函数重置为DEFault,然后,它会在用户模式下返回,以执行捕捉函数,以这种方式篡改返回路径当捕捉函数结束时。它会返间到最初的中断点,即它最后进入内核模式的地方因此,该进程会先迂回执行捕捉函数,然后再恢复正常执行。

(2)重置用户安装的信号捕捉函数:用户安装的陷阱相关信号捕捉函数用于处理用户代 码中的陷阱错误。由于捕捉函数也在用户模式下执行,因此可能会再次出现同样的错误如 果是这样,该进程最终会陷入无限循环,一直在用户模式和内核模式之间跳跃:为了防止这种情况,Unix内核通常会在允许进程执行捕捉函数之前先将处理函数重置为DEFault这意 味着用户安装的捕捉函数只对首次出现的信号有效若要捕捉再次出现的同-信号,则必须 重新安装捕捉函数°但是,用户安装的信号捕捉函数的处理方法并不都一样,在不同Unix 版本中会有所不同.例如,在BSD Unix中,信号处理函数不会被重置.但是该信号在执行信号捕捉函数时会被阻塞,感兴趣的读者可参考关于Linux信号和sigaction函数的手册页,以了解更多详细信息。

(3)信号和唤醒:在Unix/Linux内核中有两种SLEEP进程;深度休眠进程和浅度休 眠进程。前一种进程不可中断,而后一种进程可由信号中断。如果某进程处于不可中断的 SLEEP状态,到达的信号(必须来自硬件中断或其他进程)不会唤醒进程一如果它处于可中 断的SLEEP状态,到达的信号将会唤醒它:例如,当某进程等待终端输入时,它会以低优 先级休眠.这种休眠是可中断的.S1G1NT这类信号即可唤醒它。

 

信号与异常

Unix信号最初设计用于以下用途。

·作为进程异常的统一处理方法

·让进程通过预先安装的信号捕捉函数处理用户模式下的程序错误。

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

 

信号用作IPC

IPC:进程间的通信机制(应避免信号用作IPC

 

Linux中的IPC

IPC是指用于进程间通信的机制。在Linux中,IPC包含以下组成部分。

·管道和FIFO

·信号

·System V IPC

·POSIX消息队列

·线程同步机制

·套接字

posted @ 2022-10-19 10:41  20201202史婧怡  阅读(24)  评论(0编辑  收藏  举报