2 #include <sys/epoll.h> /* Linux epoll interface */
3 #include <sys/signalfd.h> /* Linux signalfd interface */
5 void die(char *); /* print error and exit function */
6 #define MAX_EPOLL_EV 10
7 int main(int argc, char *argv[])
9 /* Variables definition */
10 int i, n, nread, t = 10;
12 int fifofd, epfd, sigfd;
14 char *fifoname = "/tmp/reporter.fifo";
15 struct epoll_event epev, events[MAX_EPOLL_EV];
16 struct signalfd_siginfo siginf;
19 if ((epfd=epoll_create(5)) < 0) // epoll init
20 die("Failing on epoll_create");
21 /* Signal setup for signalfd and epoll use */
22 sigemptyset(&sigmask);
23 sigaddset(&sigmask, SIGINT);
24 sigaddset(&sigmask, SIGQUIT);
25 sigaddset(&sigmask, SIGTERM);
26 if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == -1) // block signals
27 die("Failing in sigprocmask");
28 if ((sigfd=signalfd(-1, &sigmask, SFD_NONBLOCK)) == -1) // take a signalfd
29 die("Failing in signalfd");
30 epev.data.fd = sigfd; // add fd to epoll
31 epev.events = EPOLLIN;
32 if (epoll_ctl(epfd, EPOLL_CTL_ADD, sigfd, &epev))
33 die("Failing in signal epoll_ctl");
34 /* Fifo setup for epoll use */
35 if (mkfifo(fifoname, 0622)) { // create well known fifo if does't exist
37 die("Cannot create well known fifo");
39 if ((fifofd = open(fifoname, O_RDWR|O_NONBLOCK)) < 0) // open fifo
40 die("Cannot open read only well known fifo");
41 epev.data.fd = fifofd; // add fd to epoll
42 epev.events = EPOLLIN;
43 if (epoll_ctl(epfd, EPOLL_CTL_ADD, fifofd, &epev))
44 die("Failing in fifo epoll_ctl");
45 /* Main body: wait something to report */