国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

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

2019-11-02 16:21:18
字體:
來源:轉載
供稿:網友

三種新的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:

點擊(此處)折疊或打開

#include <sys/signalfd.h> int signalfd(int fd, const sigset_t *mask, int flags);#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

l例子

#include <sys/signalfd.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define handle_error(msg) / do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { sigset_t mask; int sfd; struct signalfd_siginfo fdsi; ssize_t s; sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) handle_error("sigprocmask"); sfd = signalfd(-1, &mask, 0); if (sfd == -1) handle_error("signalfd"); for (;;) { s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo)); if (s != sizeof(struct signalfd_siginfo)) handle_error("read"); if (fdsi.ssi_signo == SIGINT) { printf("Got SIGINT/n"); } else if (fdsi.ssi_signo == SIGQUIT) { printf("Got SIGQUIT/n"); exit(EXIT_SUCCESS); } else { printf("Read unexpected signal/n"); } } }#include <sys/signalfd.h> #include <signal.h> #include <unistd.h> #include <stdlib.h> #include <stdio.h> #define handle_error(msg) / do { perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { sigset_t mask; int sfd; struct signalfd_siginfo fdsi; ssize_t s; sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) handle_error("sigprocmask"); sfd = signalfd(-1, &mask, 0); if (sfd == -1) handle_error("signalfd"); for (;;) { s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo)); if (s != sizeof(struct signalfd_siginfo)) handle_error("read"); if (fdsi.ssi_signo == SIGINT) { printf("Got SIGINT/n"); } else if (fdsi.ssi_signo == SIGQUIT) { printf("Got SIGQUIT/n"); exit(EXIT_SUCCESS); } else { printf("Read unexpected signal/n"); } } }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 福建省| 江阴市| 大邑县| 吉木萨尔县| 德兴市| 海伦市| 梧州市| 道孚县| 湟源县| 博野县| 张北县| 板桥市| 南皮县| 罗平县| 孟津县| 阳原县| 松阳县| 确山县| 忻州市| 东平县| 刚察县| 岳普湖县| 城口县| 施秉县| 榆林市| 米林县| 南宁市| 大足县| 遂平县| 卓资县| 澄江县| 安庆市| 普定县| 绥棱县| 焦作市| 酒泉市| 元阳县| 游戏| 万源市| 聊城市| 舒兰市|