タイムアウト機能付のgetchar 関数

タイムアウト機能付のgetchar 関数の例です.

シグナルハンドラとインターバルタイマによるsleep 関数の例を利用し,時間内に入力が得られなければタイムアウトします.

タイムアウト機能付のgetchar 関数(list_85.c)
#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]% 
inserted by FC2 system