シグナルハンドラ, インターバルタイマによるsleep 関数

シグナルハンドラとインターバルタイマによるsleep 関数の例です.

例題では,インターバルタイマからSIGALRMのシグナルが通知されると mysleep() 関数内の mywait() 関数を実行するようにシグナルハンドラの設定を行っていますが,mywait() 関数は何の処理も行わない待機用の関数です.

シグナルハンドラ, インターバルタイマによるsleep 関数(list_84.c)
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>

//-----------------------------------------------------------------
void mysleep(int sec,int usec);
//-----------------------------------------------------------------

int main()
{
    printf("**start sleep[%d]\n",(int)time(NULL));
    mysleep(5,0);
    printf("**end   sleep[%d]\n",(int)time(NULL));
    
    return 0;
}

void mysleep(int sec,int usec)
{
    struct sigaction sa;
    struct itimerval itimer;
    void mywait() { }

    // シグナルハンドラの設定
    memset(&sa,0,sizeof(sa));
    sa.sa_handler = mywait;
    //sa.sa_flags   = SA_RESTART; // 繰り返しなし
    if(sigaction(SIGALRM,&sa,NULL) < 0) {
        perror("sigaction");
        return;
    }
    // タイマーの設定
    itimer.it_value.tv_sec  = itimer.it_interval.tv_sec  = sec;  // sec
    itimer.it_value.tv_usec = itimer.it_interval.tv_usec = usec; // micro sec
    if(setitimer(ITIMER_REAL, &itimer, NULL) < 0){
        perror("setitimer");
        return;
    }
    
    pause();
}

実行結果
Gami[196]% ./list_84.exe
**start sleep[1118050981]
**end   sleep[1118050986]
Gami[197]% 
inserted by FC2 system