• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Linux 新的API signalfd、timerfd、eventfd使用说明

Linux 新的API signalfd、timerfd、eventfd使用说明

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了signalfd,linux eventfd,eventfd,eventfd write,linux等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Linux 新的API signalfd、timerfd、eventfd使用说明


Linux 新的API signalfd、timerfd、eventfd使用说明

三种新的fd加入linux内核的的版本:

signalfd:2.6.22

timerfd:2.6.25

eventfd:2.6.22

三种fd的意义:

lsignalfd

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

ltimerfd

可以实现定时器的功能,将定时器抽象为文件描述符,当定时器到期时可以对其read,这样也可以放到监听队列的主循环中。

leventfd

实现了线程之间事件通知的方式,也可以用于用户态和内核通信。eventfd的缓冲区大小是sizeof(uint64_t);向其write可以递增这个计数器,read操作可以读取,并进行清零;eventfd也可以放到监听队列中,当计数器不是0时,有可读事件发生,可以进行读取。

三种新的fd都可以进行监听,当有事件触发时,有可读事件发生。

signalfd涉及API:

  1. #include
  2. int signalfd(int fd, const sigset_t *mask, int flags);

参数fd:如果是-1则表示新建一个,如果是一个已经存在的则表示修改signalfd所关联的信号;

参数mask:信号集合;

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

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

l例子


  1. #include
  2. #include
  3. #include
  4. #include
  5. #include

  6. #define handle_error(msg) \
  7. do { perror(msg); exit(EXIT_FAILURE); } while (0)

  8. int main(int argc, char *argv[])
  9. {
  10. sigset_t mask;
  11. int sfd;
  12. struct signalfd_siginfo fdsi;
  13. ssize_t s;

  14. sigemptyset(&mask);
  15. sigaddset(&mask, SIGINT);
  16. sigaddset(&mask, SIGQUIT);

  17. if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
  18. handle_error("sigprocmask");

  19. sfd = signalfd(-1, &mask, 0);
  20. if (sfd == -1)
  21. handle_error("signalfd");

  22. for (;;) {
  23. s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
  24. if (s != sizeof(struct signalfd_siginfo))
  25. handle_error("read");

  26. if (fdsi.ssi_signo == SIGINT) {
  27. printf("Got SIGINT\n");
  28. } else if (fdsi.ssi_signo == SIGQUIT) {
  29. printf("Got SIGQUIT\n");
  30. exit(EXIT_SUCCESS);
  31. } else {
  32. printf("Read unexpected signal\n");
  33. }
  34. }
  35. }

L17-L21:将感兴趣的信号加入到sigset_t中;

L24:调用signalfd,把信号集与fd关联起来,第一个参数为-1表示新建一个signalfd,不是-1并且是一个合法的signalfd表示向其添加新的信号。

L29:阻塞等待信号的发生并读取。根据读取的结果可以知道发生了什么信号。

timerfd涉及的API

  1. #include
  2. int timerfd_create(int clockid, int flags);
  3. int timerfd_settime(int fd, int flags, const struct itimerspec *new_value,struct itimerspec *old_value);
  4. int timerfd_gettime(int fd, struct itimerspec *curr_value);

timerfd_create:创建一个timerfd;返回的fd可以进行如下操作:read、select(poll、epoll)、close

timerfd_settime:设置timer的周期,以及起始间隔

timerfd_gettime:获取到期时间。

  1. //函数参数中数据结构如下:
  2. struct timespec
  3. {
  4. time_t tv_sec; /* Seconds */
  5. long tv_nsec; /* Nanoseconds */
  6. };
  7. struct itimerspec
  8. {
  9. struct timespec it_interval; /* Interval for periodic timer */
  10. struct timespec it_value; /* Initial expiration */
  11. };

l例子


  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include /* Definition of uint64_t */

  8. #define handle_error(msg) \
  9. do { perror(msg); exit(EXIT_FAILURE); } while (0)

  10. void printTime()
  11. {
  12. struct timeval tv;
  13. gettimeofday(&tv, NULL);
  14. printf("printTime: current time:%ld.%ld ", tv.tv_sec, tv.tv_usec);
  15. }

  16. int main(int argc, char *argv[])
  17. {
  18. struct timespec now;
  19. if (clock_gettime(CLOCK_REALTIME, &now) == -1)
  20. handle_error("clock_gettime");

  21. struct itimerspec new_value;
  22. new_value.it_value.tv_sec = now.tv_sec + atoi(argv[1]);
  23. new_value.it_value.tv_nsec = now.tv_nsec;
  24. new_value.it_interval.tv_sec = atoi(argv[2]);
  25. new_value.it_interval.tv_nsec = 0;

  26. int fd = timerfd_create(CLOCK_REALTIME, 0);
  27. if (fd == -1)
  28. handle_error("timerfd_create");

  29. if (timerfd_settime(fd, TFD_TIMER_ABSTIME, &new_value, NULL) == -1)
  30. handle_error("timerfd_settime");

  31. printTime();
  32. printf("timer started\n");

  33. for (uint64_t tot_exp = 0; tot_exp < atoi(argv[3]);)
  34. {
  35. uint64_t exp;
  36. ssize_t s = read(fd, &exp, sizeof(uint64_t));
  37. if (s != sizeof(uint64_t))
  38. handle_error("read");

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Linux 新的API signalfd、timerfd、eventfd使用说明

相关文章

  • 2017-05-26编译器开发系列--Ocelot语言6.静态类型检查,编译器--ocelot
  • 2017-05-26手游助手应用源码项目,游助手源码项目
  • 2017-05-26AS400银行核心系统开发中的技术总结--交易和组件写法
  • 2017-05-26Android新手入门2016(8)--ListView之ArrayAdapter
  • 2017-05-26Android 6.0 系统棉花糖新的特性和功能
  • 2017-05-224.1.1 Activity初学乍练
  • 2017-05-26我的android学习经历16,android学习经历16
  • 2017-05-227.5.3 Android 4.4后WebView的一些注意事项
  • 2017-05-26Android-绘制爱心,android-绘制
  • 2017-05-26Android开发遇到的异常及解决办法,android解决办法

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Fragment,androidfragment
    • Android中的JSONObject和JSONArray的使用
    • 阿里巴巴开源Weex 开发教程,开源weex
    • 关于异地容灾的感触
    • Android 五大布局,android五大布局
    • Android获取本地相册图片、拍照获取图片,
    • overridePendingTransition,transition
    • 用Kotlin创建第一个Android项目(KAD 01),kotlinandroid
    • android视图学习---从源码角度来理解onMeasure过程
    • 2.5.6 ViewFlipper(翻转视图)的基本使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有