Wie benutzt man nanosleep () in C? Was sind "tim.tv_sec" und "tim.tv_nsec"?

77

Was ist die Verwendung von tim.tv_secund tim.tv_nsecim Folgenden?

Wie kann ich die Ausführung für 500000Mikrosekunden 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;
}
pnizzle
quelle

Antworten:

74

Eine halbe Sekunde entspricht 500.000.000 Nanosekunden, daher sollte Ihr Code lauten:

tim.tv_sec  = 0;
tim.tv_nsec = 500000000L;

Aus heutiger Sicht schläft Ihr Code für 1.0000005s (1s + 500ns).

NPE
quelle
2
cool. Nur noch eine Frage. Ich teste dies zweimal mit gettimeofday () und erhalte den Unterschied. Ich habe also einen Unterschied von einer halben Sekunde. Es gab aber auch einen sehr kleinen Bruchteil einer Sekunde, aufgrund der CPU-Verarbeitungszeit angenommen. Wie kann ich das berechnen und von meiner Schlafzeit abziehen? Meine Zeit kam als: 0.501033 sec
pnizzle
2
@pnizzle: Was genau hoffen Sie mit dieser Subtraktion zu erreichen?
NPE
2
Ich hoffe, genau 0,500000 Sekunden zu erreichen. Danke
pnizzle
4
Die meisten Timer sind nicht so feinkörnig. Besonders auf einer Multitasking-Maschine ist es schwierig, genau zu schlafen.
Dave
1
Ich habe ein bisschen gegoogelt und eine Funktion clock () gefunden. Was macht das genau? Ist es Zeit für die CPU-Nutzung?
pnizzle
53

tv_nsecist die Schlafzeit in Nanosekunden. 500000us = 500000000ns, also möchten Sie:

nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);
Dave
quelle
2
Wofür steht das ´L` am Ende 500000000L ?
Sahand
3
Dies bezieht sich auf lange Doppel. als zweites Argument von nanosleep () haben lange Doppeltyp. siehe stackoverflow.com/questions/1380653/…
EsmaeelE
1
Der Typ der zweiten Variablen der Nanosleep-Struktur ist long. Das L wird verwendet, um die Zahl in umzuwandeln. Die longUrsache ist intmö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.
KamilCuk
12

500000 Mikrosekunden sind 500000000 Nanosekunden. Sie warten nur auf 500 ns = 0,5 µs.

glglgl
quelle
9

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;
}
Sunny Shukla
quelle
Es ist also nicht nsleep (...) sondern msleep (...)?
Morbak
1
Es ist nur noch ein Zeichen, um Millisekunden richtig zu buchstabieren.
Vwvan
8

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);
ET
quelle
3

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:

Der Header muss die Zeitspezifikationsstruktur deklarieren, die mindestens die folgenden Mitglieder umfassen muss:

time_t  tv_sec    Seconds. 
long    tv_nsec   Nanoseconds.

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 */
};
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle
2

Richtigere Variante:

{
struct timespec delta = {5 /*secs*/, 135 /*nanosecs*/};
while (nanosleep(&delta, &delta));
}
Ruslan R. Laishev
quelle
1
Korrigieren Sie für Nanosecs: -> struct timespec delta = {5 / * secs * /, 135 * 1000000 / * nanosecs * /};
Stapler
135 * 1000 000 -> 135 Mikrosekunden?
Ruslan R. Laishev
135 Mikrosekunden == 135 000 Nanosekunden, da das zweite Feld den Nanosekundenwert "tv_nsec" hat
Stapler