Případně usleep()
, který není definován v POSIX 2008 (ačkoli byl definován až do POSIX 2004 a je evidentně dostupný na Linuxu a dalších platformách s historií shody s POSIX), standard POSIX 2008 definuje nanosleep()
:
nanosleep
- spánek s vysokým rozlišením#include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
nanosleep()
funkce způsobí pozastavení provádění aktuálního vlákna do doby, než je časový interval určenýrqtp
argument vypršel nebo je volajícímu vláknu doručen signál a jeho akcí je vyvolání funkce pro zachycení signálu nebo ukončení procesu. Doba pozastavení může být delší, než je požadováno, protože hodnota argumentu je zaokrouhlena nahoru na celý násobek rozlišení spánku nebo kvůli naplánování jiné aktivity systémem. Ale s výjimkou případu přerušení signálem nesmí být doba pozastavení kratší než doba uvedená vrqtp
, měřeno systémovými hodinami CLOCK_REALTIME.Použití
nanosleep()
funkce nemá žádný vliv na činnost nebo blokování jakéhokoli signálu.
Ano – starší standardy POSIX definovaly usleep()
, takže je k dispozici na Linuxu:
int usleep(useconds_t usec);
POPIS
Funkce usleep() pozastaví provádění volajícího vlákna na (alespoň) usec mikrosekundy. Spánek může být mírně prodloužen jakoukoli aktivitou systému nebo časem stráveným zpracováním hovoru nebo granularitou systémových časovačů.
usleep()
trvá mikrosekundy , takže budete muset vynásobit vstup 1000, abyste mohli usnout v milisekundách.
usleep()
byl od té doby zastaralý a následně odstraněn z POSIX; pro nový kód nanosleep()
je preferováno:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
POPIS
nanosleep()
pozastaví provádění volajícího vlákna alespoň do doby uvedené v*req
vypršelo nebo došlo k doručení signálu, který spustí vyvolání obsluhy ve volajícím vlákně nebo který proces ukončí.Časová specifikace struktury se používá k určení časových intervalů s přesností na nanosekundy. Je definován následovně:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
Příklad msleep()
funkce implementovaná pomocí nanosleep()
, pokračování spánku, pokud je přerušeno signálem:
#include <time.h>
#include <errno.h>
/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
struct timespec ts;
int res;
if (msec < 0)
{
errno = EINVAL;
return -1;
}
ts.tv_sec = msec / 1000;
ts.tv_nsec = (msec % 1000) * 1000000;
do {
res = nanosleep(&ts, &ts);
} while (res && errno == EINTR);
return res;
}
Můžete použít tuto multiplatformní funkci:
#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h> // for nanosleep
#else
#include <unistd.h> // for usleep
#endif
void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
struct timespec ts;
ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds % 1000) * 1000000;
nanosleep(&ts, NULL);
#else
if (milliseconds >= 1000)
sleep(milliseconds / 1000);
usleep((milliseconds % 1000) * 1000);
#endif
}