2014-04-07 9 views
5

Voglio dormire in un programma C11. Né usleep (in unistd.h) né nanosleep (in time.h) vengono dichiarati con l'opzione -std=c11 di gcc (4.8.2) e clang (3.2).sleep function in C11

A grep sleep /usr/include/*.h non rivela altri probabili candidati a dormire.

Ho bisogno di un sonno con precisione almeno millisecondo.

Come dormire in C11?

risposta

4

Uso -std=gnu11 anziché -std=c11 (questo funziona sia clang e gcc). Ciò causerà l'intestazione <time.h> per definire nanosleep.

Un'altra alternativa per nanosleep, chiamando pselect su un descrittore di file nullo con un timeout, anche funziona solo con -std=gnu11 e non -std=c11

Per un esempio di entrambi:

#include <stdio.h> 
#include <sys/select.h> 

int main() // Compile with -std=gnu11 (and not -std=c11) 
{ 
    struct timespec ts1 = { 
     .tv_sec = 0, 
     .tv_nsec = 500*1000*1000 
    }; 
    printf("first\n"); 
    nanosleep(&ts1, NULL); 
    printf("second\n"); 
    pselect(0, NULL, NULL, NULL, &ts1, NULL); 
    printf("third\n"); 
} 
0

Nell'intestazione threads.h c'è la funzione thrd_sleep

int thrd_sleep(const struct timespec* time_point, struct timespec* remaining) 

http://en.cppreference.com/w/c/thread/thrd_sleep

+0

Sarebbe bello se io * avessi * un threads.h. Sia clang che gcc definiscono '__STDC_NO_THREADS__', e l'unico threads.h che ho è quello del kernel di linux uno, che non è sicuramente quello giusto. – cdjc

2

C'è in <windows.h> un Funzione sleep e in <unistd.h> e usleep function

che entrambi ottengono uno unsigned int come mili-secondi.

+1

'usleep' richiede microsecondi (" u "=" μ "). Grazie per aver aggiunto la risposta sensata a questa vecchia domanda. – Potatoswatter

+0

scrivere, mi dispiace. Il sonno dura pochi millisecondi e noi dormiamo in microsecondi. –

+0

Questo è ottimo per MS Windows. Ma non stavo compilando su Windows. Il fatto che stavo sfogliando '/ usr/include /' probabilmente lo dona via. – cdjc