Просто имейте в виду, что и usleep (), и nanosleep () могут быть прерваны сигналом.nanosleep () позволяет вам передать дополнительный указатель времени, где будет сохраняться оставшееся время, если это произойдет.Поэтому, если вам действительно нужно гарантировать время задержки, вы, вероятно, захотите написать простую оболочку вокруг nanosleep ().
Остерегайтесь, что это не проверено, но что-то вроде этого:
int myNanoSleep(time_t sec, long nanosec)
{
/* Setup timespec */
struct timespec req;
req.tv_sec = sec;
req.tv_nsec = nanosec;
/* Loop until we've slept long enough */
do
{
/* Store remainder back on top of the original required time */
if( 0 != nanosleep( &req, &req ) )
{
/* If any error other than a signal interrupt occurs, return an error */
if(errno != EINTR)
return -1;
}
else
{
/* nanosleep succeeded, so exit the loop */
break;
}
} while( req.tv_sec > 0 || req.tv_nsec > 0 )
return 0; /* Return success */
}
И если вам когда-нибудь понадобится разбудить поток для чего-то другого, кроме периодического тайм-аута, взгляните на условные переменные и pthread_cond_timedwait()
.