加入收藏 | 设为首页 | 会员中心 | 我要投稿 南平站长网 (https://www.0599zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 交互 > 正文

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

发布时间:2016-11-01 05:20:11 所属栏目:交互 来源:站长网
导读:副标题#e# Linux 新的API signalfd、timerfd、eventfd使用说明 三种新的fd加入linux内核的的版本: signalfd:2.6.22 timerfd:2.6.25 eventfd:2.6.22 三种fd的意义: l s ignalfd 传统的处理信号的方式是注册信号处理函数;由于信号是异步发生的,要解决
副标题[/!--empirenews.page--] 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.  
  7.   #define handle_error(msg)
  8.   do { perror(msg); exit(EXIT_FAILURE); } while (0)
  9.  
  10.   int main(int argc, char *argv[])
  11.   {
  12.     sigset_t mask;
  13.     int sfd;
  14.     struct signalfd_siginfo fdsi;
  15.     ssize_t s;
  16.  
  17.     sigemptyset(&mask);
  18.     sigaddset(&mask, SIGINT);
  19.     sigaddset(&mask, SIGQUIT);
  20.  
  21.     if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1)
  22.         handle_error("sigprocmask");
  23.  
  24.     sfd = signalfd(-1, &mask, 0);
  25.     if (sfd == -1)
  26.         handle_error("signalfd");
  27.  
  28.     for (;;) {
  29.         s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo));
  30.         if (s != sizeof(struct signalfd_siginfo))
  31.             handle_error("read");
  32.  
  33.         if (fdsi.ssi_signo == SIGINT) {
  34.            printf("Got SIGINTn");
  35.         } else if (fdsi.ssi_signo == SIGQUIT) {
  36.         printf("Got SIGQUITn");
  37.         exit(EXIT_SUCCESS);
  38.         } else {
  39.         printf("Read unexpected signaln");
  40.         }
  41.      }
  42.   }

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

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

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

timerfd涉及的API

(编辑:南平站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读