Was ist die Verwendung von tim.tv_sec
und tim.tv_nsec
im Folgenden?
Wie kann ich die Ausführung für 500000
Mikrosekunden in den Ruhezustand versetzen ?
#include <stdio.h>
#include <time.h>
int main()
{
struct timespec tim, tim2;
tim.tv_sec = 1;
tim.tv_nsec = 500;
if(nanosleep(&tim , &tim2) < 0 )
{
printf("Nano sleep system call failed \n");
return -1;
}
printf("Nano sleep successfull \n");
return 0;
}
tv_nsec
ist die Schlafzeit in Nanosekunden. 500000us = 500000000ns, also möchten Sie:nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);
quelle
500000000L
?long
. Das L wird verwendet, um die Zahl in umzuwandeln. Dielong
Ursache istint
möglicherweise zu klein, um den Wert zu verarbeiten. Einige Sicherheitsstandards (NASA, MISRA) erzwingen die Angabe des Nummerntyps, wenn die Nummer größer als 2 ^ 16 ist, um fehlerhaften Code zu vermeiden.500000 Mikrosekunden sind 500000000 Nanosekunden. Sie warten nur auf 500 ns = 0,5 µs.
quelle
Das hat bei mir funktioniert ....
#include <stdio.h> #include <time.h> /* Needed for struct timespec */ int nsleep(long miliseconds) { struct timespec req, rem; if(miliseconds > 999) { req.tv_sec = (int)(miliseconds / 1000); /* Must be Non-Negative */ req.tv_nsec = (miliseconds - ((long)req.tv_sec * 1000)) * 1000000; /* Must be in range of 0 to 999999999 */ } else { req.tv_sec = 0; /* Must be Non-Negative */ req.tv_nsec = miliseconds * 1000000; /* Must be in range of 0 to 999999999 */ } return nanosleep(&req , &rem); } int main() { int ret = nsleep(2500); printf("sleep result %d\n",ret); return 0; }
quelle
Normalerweise verwende ich einige #define und Konstanten, um die Berechnung zu vereinfachen:
#define NANO_SECOND_MULTIPLIER 1000000 // 1 millisecond = 1,000,000 Nanoseconds const long INTERVAL_MS = 500 * NANO_SECOND_MULTIPLIER;
Daher würde mein Code so aussehen:
timespec sleepValue = {0}; sleepValue.tv_nsec = INTERVAL_MS; nanosleep(&sleepValue, NULL);
quelle
POSIX 7
Suchen Sie zuerst die Funktion: http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html
Das enthält einen Link zu a
time.h
, in dem als Header Strukturen definiert sein sollten:Mann 2 Nanosleep
Pseudo-offizielle glibc-Dokumente, die Sie immer auf Systemaufrufe überprüfen sollten:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
quelle
Richtigere Variante:
{ struct timespec delta = {5 /*secs*/, 135 /*nanosecs*/}; while (nanosleep(&delta, &delta)); }
quelle