Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1203071
  • 博文数量: 153
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2037
  • 用 户 组: 普通用户
  • 注册时间: 2016-12-21 22:26
个人简介

90后空巢老码农

文章分类

全部博文(153)

文章存档

2020年(51)

2019年(54)

2018年(47)

2017年(1)

我的朋友

分类: LINUX

2020-03-29 21:20:13

实时信号

较之于标准信号,实时信号的优势如下所示:
1. 实时信号的信号范围有所扩大,可应用于程序自定义的目的,而标准信号中可供应用随意使用的信号仅有SIGUSR1, SIGUSR2
2. 对实时信号采取的是排队管理
3. 当发送一个实时信号时,可以为信号指定百岁数据,供接收进程的信号处理器获取
4. 不同实时信号的传递顺序得到保障。如果有多个不同的实时信号处于等待,那么将率先处理具有最小编号的信号

内核会对排队的实时信号的数量进行限制

点击(此处)折叠或打开

  1. #define _POSIX_C_SOURCE 199309
  2. #include <signal.h>
  3. int sigqueue(pid_t pid, int sig, const union sigval value);
  4. /*returns 0 on success, or -1 on error*/

  5. union sigval{
  6.     int sival_int; /*integer value for accompanying data */
  7.     void *sigval_ptr; /*pointer value for accompanying data*/
  8. };
接受进程应以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

点击(此处)折叠或打开

  1. struct signalfd_siginfo{
  2.     uint32_t ssi_signo;
  3.     int32_t ssi_errno;
  4.     int32_t ssi_code;
  5.     uint32_t ssi_pid;
  6.     uint32_t ssi_uid;
  7.     int32_t ssi_fd;
  8.     uint32_t ssi_tid; /*kernel timer id*/
  9.     uint32_t ssi_band; /*band event*/
  10.     uint32_t ssi_tik; /*(kernel-internal) timer ID */
  11.     uint32_t ssi_overrun; /*overrun count (posix timers)*/
  12.     uint32_t ssi_trapno;
  13.     int32_t ssi_status;
  14.     int32_t ssi_int;
  15.     uint64_t ssi_ptr;
  16.     uint64_t ssi_utime;
  17.     uint64_t ssi_stime;
  18.     uint64_t ssi_addr;
  19. }


使用掩码来等待信号:

点击(此处)折叠或打开

  1. #include <signal.h>
  2. int sigsuspend(const sigset_t *mask);
  3. /*normally returns -1 with errno set to EINTR*/
sigsuspend()系统调用将以mask所执行的信号机来替换进程的信号掩码,然后挂起进程的执行,直到其捕获到信号,并从信号处理器中返回,一旦处理器返回,sigsuspend()会将进程信号掩码回复为调用之前的值
阅读(6029) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~