タイムアウト機能付のgetchar 関数の例です.
シグナルハンドラとインターバルタイマによるsleep 関数の例を利用し,時間内に入力が得られなければタイムアウトします.
#include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <time.h> #include <sys/time.h> //----------------------------------------------------------------- int mygetchar(int timeout); //----------------------------------------------------------------- int main() { int c = mygetchar(5); // 5秒でタイムアウト if(c) printf("input char: %c\n",c); return 0; } //----------------------------------------------------------------- // タイムアウト付き文字入力 //----------------------------------------------------------------- int mygetchar(int timeout) { char c = 0; struct sigaction sa; struct itimerval itimer; void mywait(int no) { printf("timeout.\n"); } // シグナルハンドラの設定 memset(&sa,0,sizeof(struct sigaction)); sa.sa_handler = mywait; //sa.sa_flags = SA_RESTART; if(sigaction(SIGALRM,&sa,NULL) != 0){ perror("sigaction"); return 0; } // タイマーの設定 itimer.it_value.tv_sec = itimer.it_interval.tv_sec = timeout; // sec itimer.it_value.tv_usec = itimer.it_interval.tv_usec = 0; // micro sec if(setitimer(ITIMER_REAL,&itimer,NULL) < 0) { perror("setitimer"); return 0; } // 1文字入力 read(1,&c,1); return c; } |
Gami[209]% ./mygetchar.exe timeout. --> mywait() からの出力 Gami[210]% ./mygetchar.exe a input char: a Gami[211]% |