Posted on 2007-11-21 18:45
山泉弯延 阅读(1203)
评论(0) 编辑 收藏 引用 所属分类:
UNIX Programming
/*
07.11.20 于海韵
*/
#include "sys/times.h"
#include "apue.h"
#include "fcntl.h"
clock_t times(struct tms *buf);
static void pr_times(clock_t real ,struct tms *tmsstart, struct tms *tmsend);
int main(int argc, char *argv[])
{
struct tms tmsstart,tmsend;
clock_t start,end;
off_t excursion;
if((excursion=lseek(0,0,SEEK_END))==-1)printf("can not seek!\n");
char buf[excursion];
/*printf("excutsion ==#%d\n",excursion);*/
int outfile_fd;/*out file descrite tag */
lseek(0,0,SEEK_SET);/*it is very importent to go back to the beginning of input file!*/
if(read(0,buf,excursion)==0)printf("read OK!\n");
/* buf[excursion]='\0';*/
if(argc==3 && strcmp(argv[2],"sync")==0)
{ if(( outfile_fd=open(argv[1],O_RDWR|O_CREAT|O_SYNC,0666))<0)err_sys("creat error");}
else if(argc==2)
{if (( outfile_fd=open(argv[1],O_RDWR|O_CREAT,0666))<0)err_sys("creat error");}
else{printf("para error!\n");exit(1);}
long size=1024;
fflush(stdin);
printf("BUFFSIZE USER CPU SYSTEM CPU REAL TIMES CIRCLE TIMES\n");
int n;
int t;
char *p=buf;
long redo_count;/*re do copy times*/
do{
if((start=times(&tmsstart))==-1)err_sys("times error");
redo_count=0;/*it is very import to set the counter zero at every circle */
t=1;/*it is use in the inside while */
while((n=write(outfile_fd,p,size))==size)
{ p+=size;/*the begin buf must increase every time*/
redo_count++;/*count how many times circle do*/
t=size*redo_count;/*one tag to count how many charaters we have travered*/
/* printf("excursion==%d t==%d excursion-t==%d size==%d\n",excursion,t,excursion-t,size);*/
if((excursion-t)<size)break;
}
if(excursion-t>0)
if(write(outfile_fd,p,excursion-t)!=(excursion-t))err_sys("read error");
if((end=times(&tmsend))==-1)err_sys("times error");
printf("%7ld",size);
pr_times(end-start,&tmsstart,&tmsend);
printf("%7ld\n",redo_count);
lseek(outfile_fd,0,SEEK_SET);/*let the outfile pointer go back to the beginning of outfile!*/
p=buf;/*let p return to the beginning of buf;*/
/* printf("size=%d excursion=%d\n",size,excursion);*/
} while((size*=2)<=excursion);
return 0;
}
static void
pr_times(clock_t real ,struct tms *tmsstart,struct tms *tmsend)
{static long clktck=0;
if(clktck==0)
if((clktck=sysconf(_SC_CLK_TCK))<0)
printf("sysconf error");
printf(" %2.5f",(tmsend->tms_utime-tmsstart->tms_utime)/(double)clktck);
printf(" %2.5f",(tmsend->tms_stime-tmsstart->tms_stime)/(double)clktck);
printf(" %2.5f ",real/(double)clktck);
}