?????????μ?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);
????????fd???????-1???????????????????????????????????signalfd????????????
????????mask?????????
????????flag?????汾2.6.27??????SFD_NONBLOCK??SFD_CLOEXEC??
???????????????????????????fd??????2?????read??select(poll??epoll)??close
????????
#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 ");
} else if (fdsi.ssi_signo == SIGQUIT) {
printf("Got SIGQUIT ");
exit(EXIT_SUCCESS);
} else {
printf("Read unexpected signal ");
}
}
}
????L17-L21?????????????????sigset_t?У?
????L24??????signalfd??????????fd????????????????????-1?????????signalfd??????-1??????????????signalfd???????????μ?????
????L29????????????????????????????????????????????????????
????timerfd?漰??API
????#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);
????timerfd_create?????????timerfd???????fd??????????2?????read??select(poll??epoll)??close
????timerfd_settime??????timer????????????????
????timerfd_gettime????????????
//??????????????????£?
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 */
}