2013-02-11 13 views
7

muszę napisać program w C, który musi spać milisekundach, który ma działać na różnych platformach jak Windows, Linux, Solaris, HP-UX, IBM AIX, VxWorks i WinDriver LinuxSpanie przez milisekundy w systemach Windows, Linux, Solaris, HP-UX, IBM AIX, Vxworks, Wind River Linux?

  • Na Windows , wywołanie systemowe Sleep będzie działało tylko w milisekundach.
  • Na Linux, sleep będzie działać na sekund; usleep będzie działać w mikrosekundach i będzie dostępny również w systemie Solaris.
  • W Vxworks, mam nadzieję, że mogę zaimplementować przy użyciu taskDelay i sysClkRateSet.

Jak mogę osiągnąć ten milisekundowy sen w systemach HP-UX, IBM AIX i Wind River?

+1

['usleep'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html) to POSIX, więc powinno być we wszystkich systemach zgodnych z POSIX (takich jak HP/UX, AIX itp.). Jest jednak oznaczony jako przestarzały, na rzecz ['nanosleep'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/nanosleep.html), który z kolei jest oznaczony jako opcjonalny. –

+1

Zauważ, że tylko dlatego, że możesz znaleźć sposób na * wyrażenie * opóźnienia w przedziale milisekundy, nie ma absolutnie żadnej gwarancji, że system operacyjny * dostarczy * dokładnie to, o co prosisz. Lista systemów operacyjnych: zazwyczaj nie jest wyświetlana w czasie rzeczywistym, więc najprawdopodobniej nie zagwarantują one takich rzeczy; kiedy opóźnienie się skończy, bardziej zaawansowane zadanie może zająć procesor. – unwind

+0

Czy poniższy link odpowiada na pytanie? http://stackoverflow.com/questions/1157209/is-there-an-alternative-sleep-function-in-c-to-milliseconds – kunal18

Odpowiedz

1

Rozważ select z pustymi zestawami FD i żądanym czasem oczekiwania. Od man select:

Niektóre programy wywołują select() z wszystkimi trzema zbiorami pustymi, nfds zera, a niezerowe Timeout jako dość przenośny sposób spać z subsekundową precyzją.

Właściwie może to być najlepsze rozwiązanie dla systemu innego niż Windows.

+0

Dziękuję za odpowiedź. obecnie używamy tego tylko, w niektórych platformach 'select' nie jest dostępne. Podobnie jak windriver linux 'select' nie jest dostępny. – rashok

13

Propably wrapper użyciu platformy konkretnych #define s zrobi:

#if defined(WIN32) 
    #include <windows.h> 
#elif defined(__UNIX__) 
    #include <unistd.h> 
#else 
#endif 

... 

int millisleep(unsigned ms) 
{ 
#if defined(WIN32) 
    SetLastError(0); 
    Sleep(ms); 
    return GetLastError() ?-1 :0; 
#elif defined(LINUX) 
    return usleep(1000 * ms); 
#else 
#error ("no milli sleep available for platform") 
    return -1; 
#endif 
} 

Aktualizacja

Nawiązując do Jonathan's comment below, proszę znaleźć bardziej nowoczesne, bardziej przenośne (a także poprawione: }) wersja tutaj:

#if defined(WIN32) 
    #include <windows.h> 
#elif defined(__unix__) 
    #include <time.h> 
    #include <unistd.h> 
#else 
#endif 

... 

int millisleep(unsigned ms) 
{ 
#if defined(WIN32) 

    SetLastError(0); 
    Sleep(ms); 
    return GetLastError() ?-1 :0; 

#elif _POSIX_C_SOURCE >= 199309L 

    /* prefer to use nanosleep() */ 

    const struct timespec ts = { 
    ms/1000, /* seconds */ 
    (ms % 1000) * 1000 * 1000 /* nano seconds */ 
    }; 

    return nanosleep(&ts, NULL); 

#elif _BSD_SOURCE || \ 
    (_XOPEN_SOURCE >= 500 || \ 
    _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ 
    !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) 

    /* else fallback to obsolte usleep() */ 

    return usleep(1000 * ms); 

#else 

# error ("No millisecond sleep available for this platform!") 
    return -1; 

#endif 
} 
+0

to jest naprawdę bardzo dobra odpowiedź Alk –

+0

Pod POSIX 2004, wywołanie ['usleep()'] (http://pubs.opengroup.org/onlinepubs/009695399/functions/usleep.html) zostało oznaczone jako "przestarzałe", a został usunięty z POSIX 2008. Preferowaną alternatywą jest ['nanosleep()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html).Ogólny trend w POSIX polega na preferowaniu 'struct timespec', która ma rozdzielczość nanosekundy, nad alternatywami, takimi jak' struct timeval', która ma tylko mikrosekundową rozdzielczość, lub 'usleep()' która nie używa struktury, ale działa z rozdzielczością mikrosekundy także. –

+0

@ JonathanLeffler: Dzięki za powiadomienie. Poprawione. – alk

Powiązane problemy