最近在閱讀 libev 的源碼,看到 libev 的代碼裏面的 sleep 實現, 我以爲能夠把這個 sleep 實現單獨拿出來,做爲參考,之後能夠直接拿來用。spa
代碼以下(稍有修改):code
void ev_sleep (double delay) { if (delay > 0.) { #if EV_USE_NANOSLEEP struct timespec ts; //EV_TS_SET (ts, delay); ts.tv_sec = (long)t; ts.tv_nsec = (long)((t - ts.tv_sec) * 1e9); nanosleep (&ts, 0); #elif defined _WIN32 Sleep ((unsigned long)(delay * 1e3)); #else struct timeval tv; /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */ /* something not guaranteed by newer posix versions, but guaranteed */ /* by older ones */ //EV_TV_SET (tv, delay); tv.tv_sec = (long)t; tv.tv_usec = (long)((t - tv.tv_sec) * 1e6); select (0, 0, 0, 0, &tv); #endif } }
其中的 EV_TS_SET 和 EV_TV_SET 是兩個宏定義,我直接把這兩個宏展開了。blog