2009-09-24 2 views
13

timeval 유형의 값을 인쇄하려고합니다. 사실 나는 그것을 인쇄 할 수 있어요,하지만 다음과 같은 경고 얻을 :이 줄UNIX 프로그래밍. struct timeval 인쇄 방법 (C 프로그래밍)

  • 형식 '% ld 개'에서

    여러 마커를 '긴 INT'를 입력 것으로 예상하지만, 인수 2는 입력 'timeval 구조체를 가지고 '

프로그램이 컴파일되어 값을 인쇄하지만 내가 잘못하고 있는지 알고 싶습니다. 감사.

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

은 기본 필드에서 얻을 필요가 : 사용이 struct timeval 때문에 유형

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

잘 알아? – user69514

+0

당신들은 ... 완벽하게 작동하는 바위입니다 ... – user69514

답변

20

,, struct timeval :

는 SYS/time.h에 선언하고 다음과 같은 멤버 가지고있다 :이 경과 시간의 전체 시간 (초)을 나타냅니다

long int tv_sec 

합니다.

long int tv_usec 

이것은 마이크로 초로 표시된 경과 시간의 나머지 부분입니다 (초 단위). 항상 1 백만 미만입니다.

그래서 당신은

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

1.000123처럼 "잘 형식의"타임 스탬프를 얻기 위해 수행해야합니다.

+2

내 시스템에서 struct timeval은 "time_t tv_sec"및 "suseconds_t tv_usec"로 선언됩니다. 나는 이것들을 "% ​​ld"로 인쇄하는 것이 좋았지 만 아무런 보장이 없다. 아마도 인쇄하기 오래 전에 캐스팅하는 것이 가장 안전 할 것입니다. –

7

이다

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

같은 것을 선언한다

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

% 06ld를 사용해야합니다. 그렇지 않으면 재미있는 장소에서 공백이 생깁니다. 또한 % ld를 사용하면 오래도록 캐스팅해야한다고 걱정할 필요가 있습니다. –

+0

시스템 시간을 다른 변수에 할당하려면 다음과 같이 해봅니다. long specialTime; 할 방법이 있습니까? – user69514

+0

원하는 해상도에 따라 다릅니다. 내 자신의 "struct timeval myTime;"을 선언하기로했다. 다음 "memcpy (& myTime, & (usage.ru_stime), sizeof (myTime));"를 사용하십시오. 그런 다음 나중에 ru_stime과 비교하여 지속 시간을 얻을 수 있습니다. – paxdiablo

1

은 예, timeval 형은

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

것이다 확실히 도움의 사용이

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

과 같이 정의된다.

1

그래 나는 timeval 형이 나에게 경고를 제공하지만, 제대로 할 수있는 방법이 왜 형의 긴 그게 아닙니다 물론 그

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

레코드의 경우 diff 변수를 계산하려면'#include '에 정의 된'timersub()'매크로를 사용해야합니다. 'man 3 timeradd'를 보라. –

+1

@HeisSpiter'timersub'는 POSIX 호환이 아니므로 이식성이 떨어집니다. – nwellnhof

관련 문제