Esiste una funzione di sonno alternativo in C per millisecondi?

Ho un codice sorgente che è stato compilato su Windows. Lo sto convertendo per funzionare su Red Hat Linux.

Il codice sorgente ha incluso il file di intestazione e il programmatore ha utilizzato la funzione Sleep() per attendere un periodo di millisecondi. Questo non funzionerà su Linux.

Tuttavia, posso usare la funzione sleep(seconds) , ma quella utilizza il numero intero in secondi. Non voglio convertire i millisecondi in secondi. Esiste una funzione di sospensione alternativa che posso utilizzare con la compilazione di gcc su Linux?

Sì, i vecchi standard POSIX definivano usleep() , quindi questo è disponibile su Linux:

  int usleep(useconds_t usec); 

DESCRIZIONE

La funzione usleep () sospende l’esecuzione del processo chiamante per (almeno) microsecondi usec. Il sonno può essere leggermente allungato da qualsiasi attività di sistema o dal tempo impiegato per elaborare la chiamata o dalla granularità dei timer di sistema.

usleep() richiede microsecondi , quindi dovrai moltiplicare l’input di 1000 per poter dormire in millisecondi.


usleep() è stato deprecato e successivamente rimosso da POSIX; per il nuovo codice, è preferibile il nanosleep() :

  #include  int nanosleep(const struct timespec *req, struct timespec *rem); 

DESCRIZIONE

nanosleep() sospende l’esecuzione del thread chiamante fino a quando è trascorso almeno il tempo specificato in *req o il recapito di un segnale che triggers il richiamo di un gestore nel thread chiamante o che termina il processo.

La struttura timespec viene utilizzata per specificare intervalli di tempo con precisione al nanosecondo. È definito come segue:

  struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ }; 

È ansible utilizzare questa funzione multipiattaforma:

 #ifdef WIN32 #include  #elif _POSIX_C_SOURCE >= 199309L #include  // for nanosleep #else #include  // 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 usleep(milliseconds * 1000); #endif } 

In alternativa a usleep() , che non è definito in POSIX 2008 (sebbene fosse definito fino a POSIX 2004, ed è evidentemente disponibile su Linux e altre piattaforms con una storia di conformità POSIX), lo standard POSIX 2008 definisce nanosleep() :

nanosleep – sonno ad alta risoluzione

 #include  int nanosleep(const struct timespec *rqtp, struct timespec *rmtp); 

La funzione nanosleep() deve sospendere l’esecuzione del thread corrente fino a quando non è trascorso l’intervallo di tempo specificato dall’argomento rqtp o viene inviato un segnale al thread chiamante e la sua azione è quella di richiamare una funzione di cattura del segnale o terminare il processo. Il tempo di sospensione può essere più lungo di quanto richiesto poiché il valore dell’argomento viene arrotondato a un multiplo intero della risoluzione del sonno oa causa della pianificazione di altre attività da parte del sistema. Tuttavia, salvo il caso in cui venga interrotto da un segnale, il tempo di sospensione non deve essere inferiore al tempo specificato da rqtp , come misurato dall’orologio di sistema CLOCK_REALTIME.

L’uso della funzione nanosleep() non ha alcun effetto sull’azione o il blocco di qualsiasi segnale.

Oltre l’ addormentamento , l’umile selezione con i set di descrittori di file NULL consente di mettere in pausa con precisione al microsecondo e senza il rischio di complicanze SIGALRM .

sigtimedwait e sigwaitinfo offrono un comportamento simile.

 #include  int usleep(useconds_t useconds); //pass in microseconds 
 #include  #include  int main () { puts("Program Will Sleep For 2 Seconds"); system("sleep 2"); // works for linux systems return 0; }