一、信号的作用
使用信号的目的是:
- 让进程知道已经发生了一个特定的事件
- 强迫进程执行它自己代码中的信号处理程序
实时信号32-64
内核区分内核信号传递的两个不同的阶段:
信号产生、信号传递
每个被产生的信号至多被传递一次。信号是可消费资源。
1、传递信号时所执行的操作
SIGKILL和SIGSTOP信号不可以被显示地忽略、捕捉或阻塞,必须执行他们缺省的操作。
2、POSIX信号和多线程应用
3、与信号相关的数据结构
typedef struct {
unsigned long sig[2];
} sigset_t;
(1)信号描述符和信号处理程序描述符
(2)sigaction数据结构
(3)挂起信号队列
4、在信号数据结构上的操作
二、产生信号
1、specific_send_sig_info()函数
2、send_signal()函数:该函数想指定进程发送信号
3、group_send_sig_info()函数
三、传递信号
为了处理非阻塞的挂起信号,内核调用do_signal()函数。
1、执行信号的缺省操作
2、捕获信号
(1)建立帧
(2)检查信号标志
(3)开始执行信号处理程序
(4)终止信号处理程序
3、系统调用的重新执行
(1)重新执行被未捕获信号中断的系统调用
(2)为所捕获的信号重新执行系统调用
四、与信号处理相关的系统调用
C库中封装函数sigaction()调用sys_rt_sigaction()而不是sys_action()。
(1)kill()系统调用:相应的服务例程是:sys_kill()→ kill_something_info()→kill_proc_info()
(2)tkill()和tgkill()系统调用
tkill()→sys_tkill()
tgkill()→sys_tgkill()
(3)改变信号的操作
sigaction()→sys_sigaction()
(4)检查挂起的阻塞信号
sigpending()→sys_sigpending()
(5)修改阻塞信号的集合
sigprocmask()→sys_sigprocmask()→copy_from_user()
(6)挂起进程
sigsuspend()→sys_sigsuspend()
(7)实时信号的系统调用
rt_sigaction( ), rt_sigpending( ), rt_sigprocmask( ), and rt_sigsuspend( )
rt_sigqueueinfo()
rt_sigtimedwait()一般通过sigwaitinfo()和sigtimedwait()调用rt_sigtimedwait()。