Wie verwende ich nanosleep() in C? Was sind `tim.tv_sec` und `tim.tv_nsec`?

Lesezeit: 3 Minuten

Benutzeravatar von pnizzle
pnizzle

Wozu benutzt man tim.tv_sec und tim.tv_nsec im Folgenden?

Wie kann ich die Ausführung für schlafen 500000 Mikrosekunden?

#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;
}

Eine halbe Sekunde sind 500.000.000 Nanosekunden, Ihr Code sollte also lauten:

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

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

  • Kalt. Nur noch eine Frage. Ich teste dies zweimal mit gettimeofday() und bekomme den Unterschied. Ich habe daher einen Unterschied von einer halben Sekunde. Aber es gab auch einen sehr kleinen Bruchteil einer Sekunde, aufgrund der CPU-Verarbeitungszeit annehmen. Wie kann ich das berechnen und von meiner Schlafzeit abziehen? Meine Zeit kam auf: 0,501033 Sek

    – pnizzle

    7. Oktober 2011 um 7:50 Uhr

  • @pnizzle: Was genau erhoffst du dir mit dieser Subtraktion?

    – NPE

    7. Oktober 2011 um 7:51 Uhr

  • Ich hoffe, genau 0,500000 Sekunden zu erreichen. Vielen Dank

    – pnizzle

    7. Oktober 2011 um 7:54 Uhr

  • Die meisten Timer sind nicht so feinkörnig. Besonders auf einer Multitasking-Maschine ist es schwierig, genau zu schlafen.

    – David

    7. Oktober 2011 um 7:56 Uhr

  • Ich habe ein bisschen gegoogelt und eine Funktion clock() gefunden. Was genau macht das? Ist die CPU-Auslastung zeitlich?

    – pnizzle

    7. Oktober 2011 um 8:05 Uhr

Daves Benutzeravatar
David

tv_nsec ist die Ruhezeit in Nanosekunden. 500000 us = 500000000 ns, also wollen Sie:

nanosleep((const struct timespec[]){{0, 500000000L}}, NULL);

  • Was ist das „L“ am Ende von 500000000L zum?

    – Sahand

    17. Juli 2017 um 19:50 Uhr


  • Dies bezieht sich auf lange Doppel. als zweites Argument von nanosleep() vom Typ long double. siehe stackoverflow.com/questions/1380653/…

    – EsmaeelE

    5. August 2017 um 22:12 Uhr

  • Der Typ der zweiten Variablen der Nanosleep-Struktur ist long. Das L wird verwendet, um die Zahl in umzuwandeln longweil int möglicherweise zu klein, um den Wert zu verarbeiten. Einige Sicherheitsstandards (NASA, MISRA) erzwingen die Angabe des Zahlentyps, wenn die Zahl größer als 2^16 ist, um fehlerhaften Code zu vermeiden.

    – KamilCuk

    9. Juli 2018 um 15:06 Uhr


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

Benutzeravatar von Sunny Shukla
Sonnige Schukla

Das hat bei mir funktioniert….

#include <stdio.h>
#include <time.h>   /* Needed for struct timespec */


int mssleep(long miliseconds)
{
   struct timespec rem;
   struct timespec req= {
       (int)(miliseconds / 1000),     /* secs (Must be Non-Negative) */ 
       (miliseconds % 1000) * 1000000 /* nano (Must be in range of 0 to 999999999) */ 
   };

   return nanosleep(&req , &rem);
}

int main()
{
   int ret = mssleep(2500);
   printf("sleep result %d\n",ret);
   return 0;
}

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);

Benutzeravatar von Ruslan R. Laishev
Ruslan R. Laishev

Korrektere Variante:

{
struct timespec delta = {5 /*secs*/, 135 /*nanosecs*/};
while (nanosleep(&delta, &delta));
}

Posix 7

Suchen Sie zuerst die Funktion: http://pubs.opengroup.org/onlinepubs/9699919799/functions/nanosleep.html

Das enthält einen Link zu a time.hdie als Header dort sein sollte, wo Strukturen definiert sind:

Der Header muss die Zeitspezifikationsstruktur deklarieren, die mindestens die folgenden Elemente enthalten muss:

time_t  tv_sec    Seconds. 
long    tv_nsec   Nanoseconds.

Mann 2 Nanoschlaf

Pseudo-offizielle glibc-Dokumente, die Sie immer auf Systemaufrufe überprüfen sollten:

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

1419140cookie-checkWie verwende ich nanosleep() in C? Was sind `tim.tv_sec` und `tim.tv_nsec`?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy