日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2023/12/10 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux新的API signalfd、timerfd、eventfd使用说明 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三種新的fd加入linux內核的的版本:

signalfd:2.6.22

timerfd:2.6.25

eventfd:2.6.22

三種fd的意義:

signalfd:傳統的處理信號的方式是注冊信號處理函數;由于信號是異步發生的,要解決數據的并發訪問,可重入問題。signalfd可以將信號抽象為一個文件描述符,當有信號發生時可以對其read,這樣可以將信號的監聽放到select、poll、epoll等監聽隊列中。

timerfd:可以實現定時器的功能,將定時器抽象為文件描述符,當定時器到期時可以對其read,這樣也可以放到監聽隊列的主循環中。

eventfd:實現了線程之間事件通知的方式,eventfd的緩沖區大小是sizeof(uint64_t);向其write可以遞增這個計數器,read操作可以讀取,并進行清零;eventfd也可以放到監聽隊列中,當計數器不是0時,有可讀事件發生,可以進行讀取。

三種新的fd都可以進行監聽,當有事件觸發時,有可讀事件發生。

signalfd涉及API:
[cpp] view plaincopy
  • #include?<sys/signalfd.h>??
  • 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

    timerfd涉及的API
    [cpp] view plaincopy
  • #include?<sys/timerfd.h>??
  • int?timerfd_create(int?clockid,?int?flags);??
  • int?timerfd_settime(int?fd,?int?flags,??
  • ????????????????????const?struct?itimerspec?*new_value,??
  • ????????????????????struct?itimerspec?*old_value);??
  • int?timerfd_gettime(int?fd,?struct?itimerspec?*curr_value);??
  • [cpp] view plaincopy
  • timerfd_create:創建一個timerfd;返回的fd可以進行如下操作:read、select(poll、epoll)、close??
  • timerfd_settime:設置timer的周期,以及起始間隔??
  • timerfd_gettime:獲取到期時間。??
  • [cpp] view plaincopy
  • 函數參數中數據結構如下:??
  • struct?timespec??
  • {??
  • ????time_t?tv_sec;????????????????/*?Seconds?*/??
  • ????long???tv_nsec;???????????????/*?Nanoseconds?*/??
  • };??
  • ??
  • struct?itimerspec??
  • {??
  • ????struct?timespec?it_interval;??/*?Interval?for?periodic?timer?*/??
  • ????struct?timespec?it_value;?????/*?Initial?expiration?*/??
  • };??
  • eventfd涉及API:
    [cpp] view plaincopy
  • #include?<sys/eventfd.h>??
  • int?eventfd(unsigned?int?initval,?int?flags);??
  • 創建一個eventfd,這是一個計數器相關的fd,計數器不為零是有可讀事件發生,read以后計數器清零,write遞增計數器;返回的fd可以進行如下操作:read、write、select(poll、epoll)、close

    ?

    這是三種新的fd的基本概念,接下來的幾篇會通過例子程序來說明各種fd的用法。

    總結

    以上是生活随笔為你收集整理的linux新的API signalfd、timerfd、eventfd使用说明的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。