| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > Linux开发区 > 软件开发

linux操作系统下c语言编程入门(四)

时间:2008-02-01 11:11:11  来源:Linux联盟收集整理  作者:

4)程序设计入门--时间概念 p4uLinux联盟

前言:Linux下的时间概念 p4uLinux联盟

这一章我们学习Linux的时间表示和计算函数 p4uLinux联盟

时间的表示 p4uLinux联盟

时间的测量 p4uLinux联盟

计时器的使用 p4uLinux联盟

1。时间表示 在程序当中,我们经常要输出系统当前的时间,比如我们使用date命令 p4uLinux联盟

的输出结果.这个时候我们可以使用下面两个函数 p4uLinux联盟

#include <time.h> p4uLinux联盟

 p4uLinux联盟

p4uLinux联盟

time_t time(time_t *tloc); p4uLinux联盟

char *ctime(const time_t *clock); p4uLinux联盟

time函数返回从1970110点以来的秒数.存储在time_t结构之中.不过这个函数的返 p4uLinux联盟

回值对于我们来说没有什么实际意义.这个时候我们使用第二个函数将秒数转化为字符串 p4uLinux联盟

.. 这个函数的返回类型是固定的:一个可能值为. Thu Dec 7 14:58:59 2000 这个字符串 p4uLinux联盟

的长度是固定的为26 p4uLinux联盟

2。时间的测量 有时候我们要计算程序执行的时间.比如我们要对算法进行时间分析 p4uLinux联盟

..这个时候可以使用下面这个函数. p4uLinux联盟

#include <sys/time.h> p4uLinux联盟

 p4uLinux联盟

p4uLinux联盟

int gettimeofday(struct timeval *tv,struct timezone *tz); p4uLinux联盟

strut timeval { p4uLinux联盟

long tv_sec; /* 秒数 */ p4uLinux联盟

long tv_usec; /* 微秒数 */ p4uLinux联盟

}; p4uLinux联盟

gettimeofday将时间保存在结构tv之中.tz一般我们使用NULL来代替. p4uLinux联盟

#include <sys/time.h< p4uLinux联盟

#include <stdio.h< p4uLinux联盟

#include <math.h< p4uLinux联盟

void function() p4uLinux联盟

{ p4uLinux联盟

unsigned int i,j; p4uLinux联盟

double y; p4uLinux联盟

for(i=0;i<1000;i++) p4uLinux联盟

for(j=0;j<1000;j++) p4uLinux联盟

y=sin((double)i); p4uLinux联盟

} p4uLinux联盟

main() p4uLinux联盟

{ p4uLinux联盟

struct timeval tpstart,tpend; p4uLinux联盟

float timeuse; p4uLinux联盟

gettimeofday(&tpstart,NULL); p4uLinux联盟

function(); p4uLinux联盟

gettimeofday(&tpend,NULL); p4uLinux联盟

timeuse=1000000*(tpend.tv_sec-tpstart.tv_sec)+ p4uLinux联盟

tpend.tv_usec-tpstart.tv_usec; p4uLinux联盟

timeuse/=1000000; p4uLinux联盟

printf("Used Time:%f\n",timeuse); p4uLinux联盟

exit(0); p4uLinux联盟

} p4uLinux联盟

这个程序输出函数的执行时间,我们可以使用这个来进行系统性能的测试,或者是函数算 p4uLinux联盟

法的效率分析.在我机器上的一个输出结果是: Used Time:0.556070 p4uLinux联盟

3。计时器的使用 Linux操作系统为每一个进程提供了3个内部间隔计时器. p4uLinux联盟

ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号. p4uLinux联盟

ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号. p4uLinux联盟

ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间).这个经常和上面一 p4uLinux联盟

个使用用来计算系统内核时间和用户时间.产生SIGPROF信号. p4uLinux联盟

具体的操作函数是: p4uLinux联盟

#include <sys/time.h> p4uLinux联盟

int getitimer(int which,struct itimerval *value); p4uLinux联盟

int setitimer(int which,struct itimerval *newval, p4uLinux联盟

struct itimerval *oldval); p4uLinux联盟

struct itimerval { p4uLinux联盟

struct timeval it_interval; p4uLinux联盟

struct timeval it_value; p4uLinux联盟

} p4uLinux联盟

getitimer函数得到间隔计时器的时间值.保存在value setitimer函数设置间隔计时器 p4uLinux联盟

的时间值为newval.并将旧值保存在oldval. which表示使用三个计时器中的哪一个. p4uLinux联盟

itimerval结构中的it_value是减少的时间,当这个值为0的时候就发出相应的信号了.  p4uLinux联盟

后设置为it_interval. p4uLinux联盟

#include <sys/time.h> p4uLinux联盟

#include <stdio.h> p4uLinux联盟

#include <unistd.h> p4uLinux联盟

#include <signal.h> p4uLinux联盟

#include <string.h> p4uLinux联盟

#define PROMPT "时间已经过去了两秒钟\n\a" p4uLinux联盟

char *prompt=PROMPT; p4uLinux联盟

unsigned int len; p4uLinux联盟

void prompt_info(int signo) p4uLinux联盟

{ p4uLinux联盟

write(STDERR_FILENO,prompt,len); p4uLinux联盟

} p4uLinux联盟

void init_sigaction(void) p4uLinux联盟

{ p4uLinux联盟

struct sigaction act; p4uLinux联盟

act.sa_handler=prompt_info; p4uLinux联盟

act.sa_flags=0; p4uLinux联盟

sigemptyset(&act.sa_mask); p4uLinux联盟

sigaction(SIGPROF,&act,NULL); p4uLinux联盟

} p4uLinux联盟

void init_time() p4uLinux联盟

{ p4uLinux联盟

struct itimerval value; p4uLinux联盟

value.it_value.tv_sec=2; p4uLinux联盟

value.it_value.tv_usec=0; p4uLinux联盟

value.it_interval=value.it_value; p4uLinux联盟

setitimer(ITIMER_PROF,&value,NULL); p4uLinux联盟

} p4uLinux联盟

int main() p4uLinux联盟

{ p4uLinux联盟

len=strlen(prompt); p4uLinux联盟

init_sigaction(); p4uLinux联盟

init_time(); p4uLinux联盟

while(1); p4uLinux联盟

exit(0); p4uLinux联盟

} p4uLinux联盟

这个程序每执行两秒中之后会输出一个提示. p4uLinux联盟

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
栏目更新
栏目热门