实时信号
较之于标准信号,实时信号的优势如下所示:
1. 实时信号的信号范围有所扩大,可应用于程序自定义的目的,而标准信号中可供应用随意使用的信号仅有SIGUSR1, SIGUSR2
2. 对实时信号采取的是排队管理
3. 当发送一个实时信号时,可以为信号指定百岁数据,供接收进程的信号处理器获取
4. 不同实时信号的传递顺序得到保障。如果有多个不同的实时信号处于等待,那么将率先处理具有最小编号的信号
内核会对排队的实时信号的数量进行限制
-
#define _POSIX_C_SOURCE 199309
-
#include <signal.h>
-
int sigqueue(pid_t pid, int sig, const union sigval value);
-
/*returns 0 on success, or -1 on error*/
-
-
union sigval{
-
int sival_int; /*integer value for accompanying data */
-
void *sigval_ptr; /*pointer value for accompanying data*/
-
};
接受进程应以SA_SIGINFO标志发起对sigaction()的调用,一旦采用了SA_SIGINFO标志,传递给信号处理器函数的第二个参数将会是一个siginfo_t结构,对于一个实时信号而言,会在siginfo_t结构中设置如下字段
1. si_signo
2. si_code
3. si_value,附带数据
4. si_pid,发送进程
5. si_uid, 发送进程的实际用户id
-
struct signalfd_siginfo{
-
uint32_t ssi_signo;
-
int32_t ssi_errno;
-
int32_t ssi_code;
-
uint32_t ssi_pid;
-
uint32_t ssi_uid;
-
int32_t ssi_fd;
-
uint32_t ssi_tid; /*kernel timer id*/
-
uint32_t ssi_band; /*band event*/
-
uint32_t ssi_tik; /*(kernel-internal) timer ID */
-
uint32_t ssi_overrun; /*overrun count (posix timers)*/
-
uint32_t ssi_trapno;
-
int32_t ssi_status;
-
int32_t ssi_int;
-
uint64_t ssi_ptr;
-
uint64_t ssi_utime;
-
uint64_t ssi_stime;
-
uint64_t ssi_addr;
-
};
使用掩码来等待信号:
-
#include <signal.h>
-
int sigsuspend(const sigset_t *mask);
-
/*normally returns -1 with errno set to EINTR*/
sigsuspend()系统调用将以mask所执行的信号机来替换进程的信号掩码,然后挂起进程的执行,直到其捕获到信号,并从信号处理器中返回,一旦处理器返回,sigsuspend()会将进程信号掩码回复为调用之前的值
阅读(7415) | 评论(0) | 转发(0) |