+ if ((fifofd = open(fifoname, O_RDONLY|O_NONBLOCK)) < 0) { // open fifo
+ perror("Cannot open read only well known fifo");
+ exit(1);
+ }
+ epev.data.fd = fifofd; /* add fifofd to epoll */
+ epev.events = EPOLLIN;
+ if (epoll_ctl(epfd, EPOLL_CTL_ADD, fifofd, &epev)) {
+ perror("Failing in epoll_ctl");
+ exit(-1);
+ }
+ sigemptyset(&sigmask);
+ sigaddset(&sigmask, SIGINT);
+ sigaddset(&sigmask, SIGQUIT);
+ sigaddset(&sigmask, SIGTERM);
+ // blocking signal treated by signalfd to avoid default action
+ if (sigprocmask(SIG_BLOCK, &sigmask, NULL) == -1) {
+ perror("Failing in sigprocmask");
+ exit(1);
+ }
+ if ((sigfd=signalfd(-1, &sigmask, SFD_NONBLOCK)) == -1) {
+ perror("Failing in signalfd");
+ exit(-1);
+ }
+ epev.data.fd = sigfd; /* add sigfd to epoll */
+ epev.events = EPOLLIN;
+ if (epoll_ctl(epfd, EPOLL_CTL_ADD, sigfd, &epev)) {
+ perror("Failing in epoll_ctl");
+ exit(-1);
+ }
+