キー入力のブロックとシグナル
キー入力をブロック中に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; }