GNU/Linux >> Znalost Linux >  >> Linux

Existuje alternativní funkce spánku v C až milisekundy?

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á v rqtp , 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
}

Linux
  1. Je Grub nejlepším řešením bootloadingu? Existuje snadnější alternativa?

  2. Datum v milisekundách na Openwrt na Arduino Yun?

  3. Přirozeně řečeno alternativa k drakovi?

  1. Chronobreak – alternativa časovače Pomodoro s otevřeným zdrojem

  2. Existuje způsob, jak zjistit dobu běhu posledního provedeného příkazu v shellu?

  3. Spánek na milisekundy

  1. Jak přesměrovat výstup příkazu time do souboru v Linuxu?

  2. Příkaz k získání času v milisekundách

  3. Existuje alternativa pro JTS TestBuilder na Linuxu?