2009-09-24 13 views
13

Zaman türünde bir değer yazdırmaya çalışıyorum. Aslında bunu yazdırmak mümkün, ama ben şu uyarıyı alıyorum: Bu hatUNIX Programlama. struct timeval nasıl yazdırılır (C-programming)

  • biçimi '% ld' de

    Çoklu belirteçler 'uzun int' yazın beklediğini, ancak argüman 2 tip 'yapı timeval vardır '

Program derler ve değerleri yazdırır, ancak yanlış bir şey yapıp yapmadığımı bilmek isterim. Teşekkürler.

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

Eğer altta yatan alanlara ulaşmak gerekir: kullanım struct timeval yana tip

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

iyi biliyorsun? – user69514

+0

Siz çocuklar harika ... bu mükemmel çalıştı ... – user69514

cevap

20

In the GNU C Library, struct timeval:

sys/time.h ilan aşağıdaki üyeleri vardır: Bu geçen zaman bütün saniye sayısını temsil eder

long int tv_sec 

.

long int tv_usec 

Bu

mikro sayısı olarak temsil geçen zaman dinlenme (ikinci bir fraksiyonu) 'dir. Her zaman bir milyondan azdır.

Yani

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

1.000123 gibi bir "güzel biçimlendirilmiş" damgası almak için yapmanız gerekecektir.

+2

Sistemimde, struct timeeval "time_t tv_sec" ve "suseconds_t tv_usec" ile bildirildi. Bunları "% ld" ile basma şansım oldu, ama garanti yok. Yazdırma işleminden önce uzun süre basmak muhtemelen daha güvenlidir. –

7

taşımaktadır

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

gibi bir şey ilan edilecek

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 kullanmanız gerekiyor - aksi takdirde komik yerlere boş verin. Ayrıca,% ld kullanıyorsanız, uzun süre döküm hakkında endişelenmeniz gerekir. –

+0

Sistem zamanını başka bir değişkene atamak isteseydim, şöyle diyelim: uzun specialTime; Bunu yapmanın bir yolu var mı? – user69514

+0

İstediğiniz çözünürlüğe bağlıdır. Sadece kendi "struct timeeval myTime" i ilan etmeyi tercih ederim. daha sonra "memcpy (& myTime, & (usage.ru_stime), sizeof (myTime)); Daha sonra bir süre almak için daha sonra ru_stime ile karşılaştırabilirsiniz. – paxdiablo

1

Evet, timeval

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

olacak mutlaka yardım kullanmak, bu

struct timeval { 
    time_t  tv_sec; 
    suseconds_t tv_usec; 
} 

gibi tanımlanır.

1

evet timeval bana uyarı verir, ancak düzgün bunu yapmanın bir yolu var olmasının nedeni tip uzun şu değil elbette onun

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

Kayıt için, diff değişkeninizi hesaplamak için, #include 'da tanımlanan' timersub() 'makrosunu kullanmalısınız. Bakınız adam 3 timeradd. –

+1

@HeisSpiter 'timersub' POSIX uyumlu değildir ve bu nedenle çok portatif değildir. – nwellnhof