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