8-12 シグナルを利用したepoll_wait()の解除


#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <sys/epoll.h>

#define NEVENTS 16

void
sigusr1_handler(int sig)
{
  write(fileno(stdout), "signal called\n", 14);
}

int
main()
{
  int nfds;
  int epfd;

  /* SIGUSR1のシグナルハンドラを設定 */
  signal(SIGUSR1, sigusr1_handler);

  epfd = epoll_create(NEVENTS);
  if (epfd < 0) {
    perror("epoll_create");
    return 1;
  }

  printf("before epoll_wait\n");

  /* SIGUSR1が来るまでepoll_waitはblockし続けます */
  nfds = epoll_wait(epfd, NULL, NEVENTS, -1);
  printf("after epoll_wait : %d\n", nfds);

  /* errnoがEINTRになっているのを確認してください */
  printf("%d\n", errno);
  perror("perror after epoll_wait");

  return 0;
}

拙著「Linuxネットワークプログラミング」の紹介

プロフェッショナルIPv6解説動画シリーズ再生リスト

動画で学ぶ「プロフェッショナルIPv6」を作っています。 もしよろしければご覧ください。お楽しみいただければ幸いです!