2009-09-24 11 views
13

Próbuję wydrukować wartość typu timeval. Właściwie jestem w stanie go wydrukować, ale pojawia się następujące ostrzeżenie:Programowanie w systemie UNIX. struct timeval jak go wydrukować (programowanie w języku C)

wielu znaczników na tej linii

  • format „% ld” oczekuje typu „long int”, ale argumentem 2 ma typ „struct timeval "

Program kompiluje i drukuje wartości, ale chciałbym wiedzieć, czy robię coś nie tak. Dzięki.

printf("%ld.%6ld\n",usage.ru_stime); 
    printf("%ld.%6ld\n",usage.ru_utime); 

gdzie zużycie jest typu

typedef struct{ 
    struct timeval ru_utime; /* user time used */ 
    struct timeval ru_stime; /* system time used */ 
    long ru_maxrss;  /* maximum resident set size */ 
    long ru_ixrss;   /* integral shared memory size */ 
    long ru_idrss;   /* integral unshared data size */ 
    long ru_isrss;   /* integral unshared stack size */ 
    long ru_minflt;  /* page reclaims */ 
    long ru_majflt;  /* page faults */ 
    long ru_nswap;   /* swaps */ 
    long ru_inblock;  /* block input operations */ 
    long ru_oublock;  /* block output operations */ 
    long ru_msgsnd;  /* messages sent */ 
    long ru_msgrcv;  /* messages received */ 
    long ru_nsignals;  /* signals received */ 
    long ru_nvcsw;   /* voluntary context switches */ 
    long ru_nivcsw;  /* involuntary context switches */ 
}rusage; 

struct rusage usage; 
+0

Cóż, oczywiście, wiem timeval nie jest typu long to dlaczego to daje mi ostrzeżenie, ale czy jest jakiś sposób, aby to zrobić prawidłowo? – user69514

+0

Wy, chłopaki, rocka ... który działał idealnie ... – user69514

Odpowiedz

20

In the GNU C Library, struct timeval:

jest zadeklarowany w sys/time.h i ma wchodzili:

long int tv_sec 

To oznacza liczbę pełnych sekund upływu czasu.

long int tv_usec 

Jest to pozostały czas (ułamek sekundy) reprezentowany jako liczba mikrosekund. Zawsze jest mniej niż milion.

Więc trzeba będzie zrobić

printf("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 

aby uzyskać "ładnie sformatowany" timestamp jak 1.000123.

+2

W moim systemie struktura timeval jest deklarowana za pomocą "time_t tv_sec" i "suseconds_t tv_usec". Miałem szczęście drukowanie ich za pomocą "% ld", ale nie ma żadnej gwarancji. Prawdopodobnie najbezpieczniej jest rzucić na długo przed drukowaniem. –

7

Od struct timeval zostanie ogłoszony coś takiego:

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

trzeba dostać się na polach leżących:

printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 
printf ("%ld.%06ld\n", usage.ru_utime.tv_sec, usage.ru_utime.tv_usec); 
+0

Musisz użyć% 06ld - w przeciwnym razie dostaniesz puste miejsca w zabawnych miejscach. Poza tym musisz się martwić rzutowaniem na długie, jeśli użyjesz% ld. –

+0

Jeśli chciałbym przypisać czas systemowy do innej zmiennej, powiedzmy: long specialTime; czy jest jakiś sposób na zrobienie tego? – user69514

+0

Zależy od wybranej rozdzielczości. Wybrałbym właśnie deklarowanie własnego "struct timeval myTime;" następnie używając "memcpy (& myTime, & (use.ru_stime), sizeof (myTime))". Następnie możesz porównać go później z ru_stime, aby uzyskać czas trwania. – paxdiablo

1

Tak, timeval jest zdefiniowane jak ten

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

Korzystanie

printf ("%ld.%06ld\n", usage.ru_stime.tv_sec, usage.ru_stime.tv_usec); 

pewnością pomocne.

1

tak swoją

int main(void) 
{ 
    clock_t start, stop; 
    long int x; 
    double duration; 
    static struct timeval prev; 
    struct timeval now; 

    start = clock(); // get number of ticks before loop 

    for(x = 0; x < 1000000000; x++); 
    // sleep(100); 

    stop = clock(); // get number of ticks after loop 

    // calculate time taken for loop 
    duration = (double) (stop - start)/CLOCKS_PER_SEC; 

    printf("\nThe number of seconds for loop to run was %.2lf\n", duration); 

    gettimeofday(&now, NULL); 
    prev.tv_sec = duration; 
    if (prev.tv_sec) 
    { 
     int diff = (now.tv_sec-prev.tv_sec)*1000+(now.tv_usec-prev.tv_usec)/1000; 
     printf("DIFF %d\n",diff); 
    } 

    return 0; 

} 
+2

W celu obliczenia, do obliczenia zmiennej diff, należy użyć makra 'timersub()' zdefiniowanego w '#include '. Zobacz 'man 3 timeradd'. –

+1

@HeisSpiter 'timersub' nie jest zgodny z POSIX i dlatego nie jest bardzo przenośny. – nwellnhof