#include <stdio.h> #include <time.h> #include <signal.h> #include <errno.h> /// ちゃんとミリ秒寝る関数 int sleep_msec(long long msec) { struct timespec ts; ts.tv_sec = msec/1000; ts.tv_nsec = (msec%1000)*1000000; int result; for(;;){ result = nanosleep(&ts, &ts); if(result==0 || errno!=EINTR) break; // puts("もう一度寝るよ"); } return result; } /// シグナルハンドラ void ohayo() { puts("おはよう!"); } int main() { signal(SIGHUP, ohayo); sleep_msec(100000); // 100秒寝る }
usleep() は時代遅れなので、nanosleep() を使う。
sleep系は、シグナルで起こされたときにはもう一度寝る処理が必要。
(よそでSIGHUPを受けたりすると、ついでに叩き起こされてしまう)
nanosleep() は、2番目の引数に 残り時間を入れてくれる。
このとき、同じ変数を使いまわししても大丈夫。 やったぜ