キー入力のブロックとシグナル

キー入力をブロック中にSIGNALを受信したらどうなるかの実験。
シグナルから復帰したあと、ブロックが解除されてERRが帰る様子。

// gcc -o sample main.cpp -lcurses
#include <curses.h>
#include <signal.h>
#include <string.h>

  void
sigint_handler(int signum)
{
}

void mv_printw(int line, int col, const char *format, ...)
{
  move(line, col);
  va_list ap;
  va_start(ap, format);
  vw_printw(stdscr, format, ap);
  va_end(ap);
}

void keyLoop()
{
  while(true){
    move(0, 0);
    int key=getch();
    switch(key)
    {
      case 'q':
      case 0x1b:
        return;

      case ERR:
        mv_printw(1, 0, "SIGNAL");
        break;

      default:
        mv_printw(1, 0, "%x\n", key);
        break;
    }
  }
}

bool initialize()
{
  if(initscr() == NULL){
    fprintf(stderr, "initscr failure");
    return false;
  }

  cbreak();
  //keypad(stdscr, TRUE);

  return true;
}

bool finalize()
{
  if(endwin() == ERR){
    fprintf(stderr, "endwin failure");
    return false;
  }

  return true;
}

bool setupSignal()
{
  struct sigaction sa_sigint;
  memset(&sa_sigint, 0, sizeof(sa_sigint));
  sa_sigint.sa_handler = sigint_handler;
  //sa_sigint.sa_handler = SIG_IGN;
  //sa_sigint.sa_flags = SA_RESTART;

  if (sigaction(SIGINT, &sa_sigint, NULL) < 0) {
    perror("sigaction");
    return false;
  }

  return true;
}

int main()
{
  if(!initialize()){
    return 1;
  }

  if(!setupSignal()){
    return 2;
  }

  const char *msg="press [q] to quit";
  mv_printw(LINES/2, (COLS-strlen(msg))/2, msg);

  keyLoop();

  if(!finalize()){
    return 3;
  }

  return 0;
}