C   32

signalfd.c

Guest on 5th May 2022 10:58:52 PM

  1. #include <errno.h>
  2. #include <fcntl.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <sys/epoll.h>
  7. #include <signal.h>
  8. #include <unistd.h>
  9. #include <sys/signalfd.h>
  10. #include <inttypes.h>
  11. #include "common.h"
  12.  
  13. static void print_event (struct epoll_event ev) {
  14.         char flags_str[200];
  15.  
  16.         flags_str[0] = 0;
  17.         flags_str[1] = 0; /* dirty */
  18.  
  19.         if (ev.events & EPOLLIN )       strcat(flags_str, "|EPOLLIN");
  20.         if (ev.events & EPOLLOUT)       strcat(flags_str, "|EPOLLOUT");
  21.         if (ev.events & EPOLLERR)       strcat(flags_str, "|EPOLLERR");
  22.         if (ev.events & EPOLLHUP)       strcat(flags_str, "|EPOLLHUP");
  23.         if (ev.events & EPOLLRDHUP)     strcat(flags_str, "|EPOLLRDHUP");
  24.         if (ev.events & EPOLLPRI)       strcat(flags_str, "|EPOLLPRI");
  25.         if (ev.events & EPOLLET)        strcat(flags_str, "|EPOLLET");
  26.         if (ev.events & EPOLLONESHOT)   strcat(flags_str, "|EPOLLONESHOT");
  27.  
  28.         fprintf(stderr, "Event for fd %i. Flags=(%s).\n",
  29.                         ev.data.fd, flags_str+1);
  30. }
  31.  
  32. int setup_signalfd() {
  33.         int sfd, ret;
  34.         sigset_t sigset;
  35.  
  36.         ret = sigprocmask(SIG_SETMASK, NULL, &sigset);
  37.         if (ret < 0)
  38.                 die("sigprocmask.1");
  39.  
  40.         sigaddset(&sigset, SIGINT);
  41.         sigaddset(&sigset, SIGUSR1);
  42.         sigprocmask(SIG_SETMASK, &sigset, NULL);
  43.         if (ret < 0)
  44.                 die("sigprocmask.2");
  45.  
  46.         sigemptyset(&sigset);
  47.         sigaddset(&sigset, SIGINT);
  48.         sigaddset(&sigset, SIGUSR1);
  49.  
  50.         sfd = signalfd(-1, &sigset, 0);
  51.         if (sfd < 0)
  52.                 die("signalfd");
  53.  
  54.         printf("sfd is %i\n", sfd);
  55.  
  56.         return sfd;
  57. }
  58.  
  59. void read_sig(int sfd) {
  60.         struct signalfd_siginfo info;
  61.         int ret;
  62.  
  63.         ret = read(sfd, &info, sizeof info);
  64.         if (ret != sizeof info)
  65.                 die("!?!?!?!");
  66.  
  67.         printf("Recibida seƱal\n"n");
  68.         printf("signo = %" PRIu32 "\n", info.ssi_signo);
  69.         printf("pid   = %" PRIu32 "\n", info.ssi_pid);
  70.         printf("uid   = %" PRIu32 "\n", info.ssi_uid);
  71. }
  72.  
  73. int main() {
  74.         int epfd;
  75.         struct epoll_event ev;
  76.         struct epoll_event ret;
  77.         char buf[200];
  78.         int n, t;
  79.         int sfd;
  80.  
  81.         epfd = epoll_create(1);
  82.         sfd = setup_signalfd();
  83.  
  84.         ev.data.fd = 0;
  85.         ev.events = EPOLLIN;
  86.         if (epoll_ctl(epfd, EPOLL_CTL_ADD, 0, &ev) != 0)
  87.                 perror("epoll_ctl");
  88.  
  89.         ev.data.fd = sfd;
  90.         ev.events = EPOLLIN;
  91.         if (epoll_ctl(epfd, EPOLL_CTL_ADD, sfd, &ev) != 0)
  92.                 perror("epoll_ctl");
  93.  
  94.         while ((n = epoll_wait(epfd, &ret, 1, -1)) > 0) {
  95.                 printf("tick!\n");
  96.                 print_event(ret);
  97.  
  98.                 if (ret.data.fd == 0) {
  99.                         t = read(0, buf, 100);
  100.  
  101.                         if (t == 0) {
  102.                                 epoll_ctl(epfd, EPOLL_CTL_DEL, 0, NULL);
  103.                                 close(0);
  104.                                 printf("stdin done\n");
  105.                         }
  106.                 } else if (ret.data.fd == sfd) {
  107.                         read_sig(sfd);
  108.                 }
  109.         }
  110.  
  111.         return 0;

Raw Paste


Login or Register to edit or fork this paste. It's free.