a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 61|回复: 0

[C语言] Linux下C语言编程——时间概念

[复制链接]
发表于 2012-7-31 21:48:08 | 显示全部楼层 |阅读模式
  前言& w5 A5 K/ u3 Z3 ~) X* e8 C1 ~
  这一章我们学习linux的时间表示和计算函数
& }% c. d: }: m' q  1.时间的表示
5 ?8 d! |4 K. F4 N3 U+ U; V) S  2.时间的测量
; q8 |  p2 ^3 e" f5 a- \) ^  3.计时器的使用
7 R- D! i1 u2 o+ f- j$ S  在程序当中,我们经常要输出系统当前的时间,比如我们使用date命令的输出结果.这个时候我们可以使用下面两个函数! ~$ i. s8 k# z: s4 m
  #include
& d1 R! _# X# X; A  Z* I2 ^  time_t time(time_t *tloc);
& w9 b. O' u0 }8 w" k  char *ctime(const time_t *clock);
0 W9 N: @2 M+ L2 V) F: ?  time函数返回从1970年1月1日0点以来的秒数.存储在time_t结构之中.不过这个函数的返回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串. 这个函数的返回类型是固定的:一个可能值为. thu dec 7 14:58:59 2000 这个字符串的长度是固定的为269 |( f) O% @( ?/ i
  有时候我们要计算程序执行的时间.比如我们要对算法进行时间分析.这个时候可以使用下面这个函数.1 r' U7 h7 n: M) I
  #include( q4 V) Z! J7 N/ z2 l
  int gettimeofday(struct timeval *tv,struct timezone *tz);
! b) S) c( h3 N8 p  strut timeval {/ A# f5 @& R/ e3 M8 ^; [
  long tv_sec; /* 秒数 */. d0 e% r% G. I( w) ]
  long tv_usec; /* 微秒数 */
% I; ~' O; |+ h+ ^  };( v% R+ F, D" p/ W7 S, B
  gettimeofday将时间保存在结构tv之中.tz一般我们使用null来代替.  D! l0 D! y4 Y
  #include
% @6 a- z. k4 }6 I8 A' ]  #include0 o& d4 m4 F) ^
  #include' N/ ~- a( v9 K( Z
  void function()
3 E) B" g' J# Y$ b" I8 p. o  {
3 d; m/ ?! Z# k  unsigned int i,j;
: _) h2 b# L* \1 g4 f  double y;
- v3 b% g$ L9 r3 W4 L5 {  for(i=0;i1000;i++)5 O% p. C( r* M6 E! n0 [
  for(j=0;j1000;j++)5 p, N/ E3 c& g  `
  y=sin((double)i);+ ]4 u( c" s. Y# o
  }
! z! v  O8 Z1 E2 J. L  main()$ u1 s4 ~1 C( o# A3 s
  {' ]- ?$ w& a* K" c" d3 ^2 @
  struct timeval tpstart,tpend;5 X: _, z8 s' ~4 ^; f; j3 t4 s! z. T
  float timeuse;
7 M8 p" c: J0 J# J; A  gettimeofday(&tpstart,null);
5 [  h, T. Y: y& a) [4 |0 \( b  function();
$ o1 B  g5 ~# w5 W1 H. }  gettimeofday(&tpend,null);
( Z8 [  i" j+ `3 T) D  timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+& j8 [5 t$ @6 |$ y9 V
  tpend.tv_usec-tpstart.tv_usec;
, H: C! O( R/ f& t& j, N  timeuse/=1000000;
9 {' F, k# K0 D1 q+ Y! ?9 @  printf(“"used time:%f““n“",timeuse);$ e+ V  E9 [1 c8 d% S
  exit(0);
) X4 U) Y* L, A0 e$ N3 v6 s0 I  }
& v. n  X- U+ G0 _: E! Y, U, ^1 e  这个程序输出函数的执行时间,我们可以使用这个来进行系统性能的测试,或者是函数算法的效率分析.在我机器上的一个输出结果是: used time:0.5560709 m/ x  ]' e% j) E2 x
  linux操作系统为每一个进程提供了3个内部间隔计时器.+ T+ D/ ~  n& J; C4 v
  itimer_real:减少实际时间.到时的时候发出sigalrm信号.) X( I; G- F. L/ k
  itimer_virtual:减少有效时间(进程执行的时间).产生sigvtalrm信号.7 _8 i/ M& r+ ^+ u4 n  u
  itimer_prof:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一个使用用来计算系统内核时间和用户时间.产生sigprof信号.
% b4 U$ u- x6 a, e) H$ C  具体的操作函数是:
& z& ~8 z7 g) \  @" N  #include
- k) p- I& b, W( S" N  int getitimer(int which,struct itimerval *value);5 e9 x1 D# I, s) k
  int setitimer(int which,struct itimerval *newval,0 _: M% ~. D3 v9 _9 x) J
  struct itimerval *oldval);
. l9 Z3 ~& f( X: _9 F# C  struct itimerval {
' I# x$ F1 p. G8 ]4 ?- [6 f  struct timeval it_interval;- ^6 F7 S5 W3 L0 _
  struct timeval it_value;
0 L0 @& Y" y% p5 Z' G' ~  }3 U# P1 b4 q" ?8 |5 w9 n0 }4 I$ ~6 Q
  getitimer函数得到间隔计时器的时间值.保存在value中 setitimer函数设置间隔计时器的时间值为newval.并将旧值保存在oldval中. which表示使用三个计时器中的哪一个. itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了. 然后设置为it_interval值.9 ?' Q: s; i  i- r9 T
  #include
* v" F5 a4 L' K& C% Q# d  v7 s  #include
) @) v5 T: s5 a8 o4 k  t  #include
; J, o# F/ [+ n# ]  ?  #include
) H$ F9 x% K3 U6 _4 z& ~  #include
- o  B) ?2 A/ t" f% u% X  g  #define prompt “"时间已经过去了两秒钟““n““a“"
& z! K8 W; u! ?# a6 z) V  char *prompt=prompt;* V* u0 @  |: d; U. E. I# T$ }
  unsigned int len;
, r* P( W6 A# l; H8 O* l  void prompt_info(int signo)
7 X2 t) s1 N3 }$ u6 H  {- l6 _/ M9 h+ d
  write(stderr_fileno,prompt,len);  W1 b, _8 v0 c- s0 E7 R
  }1 m1 N& E. S# \5 i" s3 d1 u' g
  void init_sigaction(void)
  ^9 F- ?/ E* q$ {1 h6 g3 c1 s  {
  R- ]+ Z% N6 A3 ]3 ?  struct sigaction act;
% l! S2 V* e3 [0 W; j( u  act.sa_handler=prompt_info;; o8 M9 ^& X* G" L6 ]
  act.sa_flags=0;, {  ^5 s3 d; i( E/ \* m* b# u
  sigemptyset(&act.sa_mask);
/ L( H2 h' W- U* c2 P$ \1 P  sigaction(sigprof,&act,null);
# Y4 r! |8 @0 `4 A  }  Z) q* R+ P1 N8 f: E
  void init_time()
& Y. X3 k6 H. U& o  {
  p7 V1 A% ?2 U" e0 K  N  struct itimerval value;* I) Y  Q4 I" Z+ g( d
  value.it_value.tv_sec=2;
* L4 ~0 v3 O* {  value.it_value.tv_usec=0;
% G& L- N5 I: B- ~  value.it_interval=value.it_value;8 ]0 g, Q( N4 Q% c$ g  x8 I
  setitimer(itimer_prof,&value,null);4 ^* B- P8 C" S+ t3 z. y
  }
: w8 E* n8 a& T8 f2 \2 R% ^4 i, q  int main()
, T! b( m/ h7 A, t* B# ^, T9 A) K  {
' E$ p7 v) j. k. C# B, v. o% a  len=strlen(prompt);
3 d* {: t! Z3 l9 Q  init_sigaction();
' e6 f+ y. W& V/ _7 o  init_time();
1 ^4 p0 d( r0 u) z: z9 o  while(1);  X: F) W- \- C2 P9 `( s
  exit(0);7 a3 k- ?# R$ k) \- u0 y0 s; n
  }$ V' W: a0 K" K1 I$ {3 l
  这个程序每执行两秒中之后会输出一个提示.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 09:01 , Processed in 0.259469 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表