epoll监听信号事件-signalfd

简介: epoll监听信号事件-signalfd

signalfd介绍

signalfd:传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决数据的并发访问,可重入问题。signalfd可以将信号抽象为一个文件描述符,当有信号发生时可以对其read,这样可以将信号的监听放到select、poll、epoll等监听队列中。当有事件触发时,有可读事件发生。

signalfd涉及API:

#include <sys/signalfd.h>
int signalfd(int fd, const sigset_t *mask, int flags);

参数fd:如果是-1则表示新建一个,不是-1并且是一个合法的signalfd表示向其添加新的信号。

参数mask:信号集合。

参数flag:内核版本2.6.27以后支持SFD_NONBLOCK、SFD_CLOEXEC。

成功返回文件描述符,返回的fd支持以下操作:read、select(poll、epoll)、close。

  1. 将感兴趣的信号加入到sigset_t中
  2. 调用signalfd(),把信号集与fd关联起来
  3. 调用sigprocmask(),把信号集添加进去,避免触发这些信号的默认处理方式
  4. 阻塞等待信号的发生并读取
  5. 与传统的处理信号的方式一样,发送多个相同的信号,只处理一次

epoll+signalfd

#include <signal.h>
#include <string>
#include <sys/epoll.h>
#include <sys/signalfd.h>
#include <unistd.h>
#include<iostream>
void signalCallBackFunc(int signalFd) {
  struct signalfd_siginfo fdsiI;
  std::cout << "signalCallBackFunc" << std::endl;
  int s = read(signalFd, &fdsiI, sizeof(struct signalfd_siginfo));
}
int main() {
  int epfd = epoll_create1(0);
  sigset_t sigintMask;
  sigemptyset(&sigintMask);
  sigaddset(&sigintMask, SIGINT);
  sigprocmask(SIG_BLOCK, &sigintMask, NULL);
  int sigintfd;
  sigintfd = signalfd(-1, &sigintMask, 0);
  struct epoll_event sigintEvent;
  sigintEvent.data.fd = sigintfd;
  sigintEvent.events = EPOLLIN;
  epoll_ctl(epfd, EPOLL_CTL_ADD, sigintfd, &sigintEvent);
  struct epoll_event events[1024];
  while (1) {
    int n = epoll_wait(epfd, events, 1024, -1);
    for (int i = 0; i < n; i++) {
      auto returnfd = events[i].data.fd;
      signalCallBackFunc(returnfd);
    }
  }
}





目录
相关文章
|
3天前
|
编译器 C++ 开发者
QT基础【7-跨进程发送信号】
QT基础【7-跨进程发送信号】
|
3天前
QT自定义信号,信号emit,信号参数注册
使用signals声明返回值是void在需要发送信号的地方使用emit 信号名字(参数)进行发送在需要链接的地方使用connect进行链接ct进行链接。
19 0
QT自定义信号,信号emit,信号参数注册
|
3天前
v-on能否监听多个事件?
v-on能否监听多个事件?
|
3天前
|
Go
通道计时器,处理事件的新思路
通道计时器,处理事件的新思路
23 0
|
3天前
[Qt5] 鼠标响应事件和计时器事件
[Qt5] 鼠标响应事件和计时器事件
27 0
|
8月前
|
弹性计算 应用服务中间件 Shell
使用WaitCondition与WaitConditionHandle进行信号通知
本场景主要介绍使用ALIYUN::ROS::WaitCondition与ALIYUN::ROS::WaitConditionHandle进行信号通知。
56 0
|
8月前
|
API
如何将回调和中断服务函数进行结合?
如何将回调和中断服务函数进行结合?
60 0
|
11月前
STM32中断与事件的理解
STM32中断与事件的理解
301 0
基于epoll封装的事件回调miniserver
epoll技术前两节已经阐述过了,目前主要做一下封装,很多epoll的服务器都是采用事件回调方式处理, 其实并没有什么复杂的,我慢慢给大家阐述下原理。 在networking.h和networking.cpp里,这两个文件主要实现了一些文件读写功能的回调函数 。
899 0
彻底学会使用epoll(二)——ET和LT的触发方式
分析了ET和LT的实现方式,那么分析他们的触发方式就容易多了。我们通过实现分析知道LT模式下epoll_wait被唤醒可以通过两种方式(图中红线和蓝线),而ET模式只能通过一种方式(图中红线)。
1464 0