Advertisement

Linux real-time signal (实时信号)

阅读量:

Linux中的信号分为两种类型:一种是Standard Signals(标准信号),其具体定义可以在包含头文件<signal.h>时查看;另一种则被称为Real-Time Signals。

实时信号

实时信号是基于Posix标准开发的,并且其取值范围为SIGRTMIN至SIGRTMAX(signal real-time min)。例如,在 arm Linux 系统中,SIGRTMIN被定义为32, 而 SIGRTMAX则为64。需要注意的是, 通常libc会对SIGRTMIN进行修改, 以便保留几个预设的值用于pthread内部运行, 比如glibc就保留了三个特定值。因此在实际应用中, 建议采用 SIGRTMIN+n 或 SIGRTMAX-n 的组合方式来表示实时信号, 而不是直接引用固定数值。值得注意的是, 实时信号与标准信号之间的优先级在POSIX规范中并未明确规定, 一般情况下标准信号会被优先处理。

和标准信号的比较:

  • 实际上实时与标准之间存在差异,这种差异是没有预设意义的,由操作者自行决定其使用方式.
  • 当实际无法接收同步请求时,会将多个实际请求分别处理.
  • 在采用sigqueue发送数据的过程中,可附加int或pointer类型的附加数据.
  • 由于实际带有时间先后顺序特征,因此会在特定时间内依次被触发.
  • 具有优先权属性,数值越小则优先级越高,在执行顺序上也是一样的.
  • 实际运行模式统一指向终结当前作业与同步不同.

与实时信号相关的API接口
**int sigaction(int signum, const struct sigaction act, struct sigaction oldact);
该函数允许设置信号处理机制,并通过指定handler来实现这一功能。值得注意的是,默认情况下handler仅接收信号参数;但通过提供data参数(即void (*sa_sigaction)(int, siginfo_t *, void * data)),我们可以扩展其功能以传递额外信息。

int sigqueue(pid_t pid, int sig, const union sigval value);
函数sigqueue接收一个信号量对象sigval value,并将该信号发送给指定的进程ID pid。

全部评论 (0)

还没有任何评论哟~