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);
    }
  }
}





目录
相关文章
|
11月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
3089 36
微服务架构解析:跨越传统架构的技术革命
|
前端开发 JavaScript Android开发
React-Native优质开源项目
React-Native优质开源项目
|
JavaScript 数据可视化 算法
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
vue3+threejs可视化项目——搭建vue3+ts+antd路由布局(第一步)
322 6
|
编解码 自然语言处理 数据可视化
精通 Transformers(四)(4)
精通 Transformers(四)
507 0
|
算法 C++
【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]
【C++入门到精通】智能指针 shared_ptr循环引用 | weak_ptr 简介及C++模拟实现 [ C++入门 ]
629 0
|
监控 网络协议 Linux
在Linux中,如何监控系统性能?
在Linux中,如何监控系统性能?
|
Python
Python线程锁(Thread Lock)和进程锁(Process Lock)
Python线程锁(Thread Lock)和进程锁(Process Lock)
601 0
|
SQL 数据库连接 API
SqlAlchemy 2.0 中文文档(五十五)(3)
SqlAlchemy 2.0 中文文档(五十五)
461 1
服务器如何升级
轻量云服务器提供高效灵活的计算服务。当需要更多存储空间时,用户可以轻松升级硬盘。无需停机,几步操作即可完成扩容,有效提升运行效率与承载能力,满足业务发展的需求。
WK
|
机器学习/深度学习 算法 大数据
鱼群算法
鱼群算法(FSA)是一种基于仿生学的群智能算法,模拟鱼群在水中集群、觅食和逃避捕食的行为,寻找问题空间中的全局最优解。该算法由李晓磊等人于2002年提出,通过初始化鱼群、评估适应度、更新行为和终止条件等步骤进行迭代优化。其优点包括实现简单、全局搜索能力强和自适应性好,但收敛速度较慢且易陷入局部最优。FSA已广泛应用于函数优化、路径规划、图像分割等领域,并有望通过改进性能、结合其他算法及拓展应用领域等方式进一步提升其应用价值。
WK
355 0