Avatar billede oddi Nybegynder
17. november 2008 - 15:54 Der er 10 kommentarer og
1 løsning

Synkronisere tid i Linux

Hej Eksperter.

I mit program henter jeg klokkeslæt og dato via:

void getTime(char *timeDate)
{
    time_t rawtime;
    struct tm * ptm;
   
    time ( &rawtime );
   
    ptm = gmtime (&rawtime );

    strftime(timeDate, NAVTEXTIMELEN, "%R\n%d/%m/%y", ptm);
 
}

Men hvordan kan jeg "ændre" på klokken, hvis jeg f.eks får oplysninger om at klokken er noget andet.

Det jeg mener er at jeg vil "synkronisere" linux klokken med det klokkeslæt jeg får et andet sted fra (f.eks gps).

Mvh Oddi
Avatar billede arne_v Ekspert
17. november 2008 - 15:58 #1
Der er en settimeofday funktion til det.
Avatar billede arne_v Ekspert
17. november 2008 - 15:58 #2
Og den bruger timeval er mere praecis end time_t.

PS: Er du ved at genopfinde NTP ?
Avatar billede oddi Nybegynder
17. november 2008 - 16:04 #3
Jeg har ikke netværksforbindelse, kun en gps...
Avatar billede oddi Nybegynder
17. november 2008 - 16:22 #4
Så ved at bruge gettimeofday(struct timeval *tv, struct timezone *tz) skal jeg omregne f.eks 123408 (hhmmyy som er den tidsformat jeg får) om til antal sekunder siden 1 jan 1970, så jeg kan sætte timeval structen?
Avatar billede arne_v Ekspert
17. november 2008 - 17:11 #5
Du kan vel saette timeval structen uden brug af gettimeofday.
Avatar billede oddi Nybegynder
18. november 2008 - 17:32 #6
Ahhh noget bøvl... Findes der virkelig ikke en nem måde at justere tiden på? Skal jeg virkelig til at lave system-kald <-- ØV!
Avatar billede arne_v Ekspert
18. november 2008 - 17:34 #7
du kan ogsaa saette den med en shell kommando ...
Avatar billede oddi Nybegynder
18. november 2008 - 17:44 #8
Jeg har ikke mulighed for at sætte den med shell kommando, da mit prog. skal kunne synkronisere sig selv med tiden fra en gps...
Avatar billede arne_v Ekspert
18. november 2008 - 23:52 #9
Jeg kender ikke nogen systemer hvor du kan sætte tiden uden at bruge enten et
system kald eller en shell kommando (og shell kommandoen bruger jo åbenlyst også
et system kald).
Avatar billede oddi Nybegynder
19. november 2008 - 10:28 #10
Nåh jeg fandt en løsning. Men en lille advarsel for dem som vil prøve programmet: settimeofday() ændrer system klokken! og for at programmet skal kunne køre skal man være super user (sudo)

#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>

int main()
{
    struct tm *mytime;
    time_t rawtime, now;
    struct timeval tv, *tvptr;
    char buf[80];

    tvptr = &tv;
   
    /*
    *Hent tiden (epoc)
    */
    time(&rawtime);

    /*
    *localtime() modtager en time_t struct og returnerer en pointer
    *til en tm struct
    */
    mytime = localtime(&rawtime);

    /*
    *Her ændres tiden til det man ønsker...
    */
    mytime->tm_sec  = 10;
    mytime->tm_min  = 10;
    mytime->tm_hour = 10;
 

    /*
    *mktime retunerer en time_t og justerer time_t structen
    *således at time_t structen bliver som ønsket, via tm structen
    */
    now = mktime(mytime);
 
    /*
    *time_t variablen sættes i timeval structen
    */
    tv.tv_sec = now;

    /*
    *settimeofday sætter systemtiden til hvad tv.tv_sec er sat til.
    */
    if(settimeofday(tvptr, NULL) == -1)
        perror("settimeofday");

    while(1)
    {
        /*Hent tiden*/
        time(&now);
        /*Formater tiden til noget "brugbart..."*/
        strftime(buf, 80, "%H:%M:%S", localtime(&now));
        /*Print tiden*/
        printf("%s\r", buf);
        fflush(stdout);
        usleep(1000000);
    }

    return 0;

}

En udmærket side som forklarer time.h:
http://www.cplusplus.com/reference/clibrary/ctime/mktime.html

Send et svar arne_v :)
Avatar billede arne_v Ekspert
20. november 2008 - 02:42 #11
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester