信号
信号(又称为软中断信号),在软件层次上是对中断机制的一种模拟,在原理上,一个线程收到一个信号与处理器收到一个中断请求可以说是类似的。
信号的工作机制
信号在RT-Thread中用作异步通信,POSIX标准定义了sigset_t类型来定义一个信号集,然而sigset_t类型在不同的系统可能有不同的定义方式,在RTT中,定义成了unsigned long型,应用程序能够使用的信号为SIGUSR1(10)和SIGUSR2(12)。
信号本质是软中断,用来通知线程发生来了异步事件,用做线程之间的异常通知、应急处理。一个线程不必通过任何操作来等待信号的到达,事实上,线程也不知道信号到底什么时候到达,线程之间可以互相通过调用 rt_thread_kill() 发送软中断信号。
收到信号的线程对各种信号有不同的处理方法,处理方法可以分为三类:
- 类似中断的处理程序,对于需要处理的信号,线程可以指定处理函数,由该函数来处理。
- 忽略某个信号,对该信号不做任何处理,就像未发生过一样。
- 对该信号的处理保留系统的默认值。
如下图所,线程1需要对信号进行处理,首先线程1安装一个信号并解除阻塞,并在安装的同时设定了对信号的异常处理方式;然后其他线程可以给线程1发送信号,触发线程1对该信号的处理。
当信号被传递给线程 1 时,如果它正处于挂起状态,那会把状态改为就绪状态去处理对应的信号。如果它正处于运行状态,那么会在它当前的线程栈基础上建立新栈帧空间去处理对应的信号,需要注意的是使用的线程栈大小也会相应增加。
安装信号
如果线程要处理某一信号,那么就要在线程中安装该信号。安装信号主要用来确定信号值及线程针对该信号值的动作之间的映射关系,即线程将要处理哪个信号,该信号被传递给线程时,将执行何种操作。
rt_sighandler rt_signal_install(int signo, rt_sighandler_t[] handler);