#include    <stdio.h>
#include    <sys/time.h>
#include    <signal.h>

static int  ringring; /* 待ちフラグ */

int MicroSleep(long sec,long usec)
{
struct itimerval    val,oval;
static void         sleephandler();

    /* 待つ必要がない */
    if(sec==0&&usec==0){
        return(0);
    }

    /* 実時間タイマの現在値を得、クリア */
    timerclear(&val.it_interval);
    timerclear(&val.it_value);
    if(setitimer(ITIMER_REAL,&val,&oval)<0){
        return(sec);
    }

    /* 実時間タイマの現在値と指定値を比較し残り時間を計算しておく */
    val.it_value.tv_sec=sec;
    val.it_value.tv_usec=usec;
    if(timerisset(&oval.it_value)){
        if(timercmp(&oval.it_value,&val.it_value,>)){
            oval.it_value.tv_sec-=val.it_value.tv_sec;
            oval.it_value.tv_usec-=val.it_value.tv_usec;
        }
        else{
            val.it_value=oval.it_value;
            oval.it_value.tv_sec=1;
            oval.it_value.tv_usec=0;
        }
    }

    /* シグナルハンドラ登録 */
    signal(SIGALRM,sleephandler);
    ringring=0;

    /* 実時間タイマに指定時間をセット */
    setitimer(ITIMER_REAL,&val,(struct itimerval *)0);

    /* 待ち */
    while(!ringring){
        sigpause(SIGALRM);
    }

    /* 元のタイマの残り時間をセット */
    setitimer(ITIMER_REAL,&oval,(struct itimerval *)0);
    return(0);
}

static void sleephandler(int sig)
{
    if(sig==SIGALRM){
        ringring=1;
    }
}
