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");} elseif(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);
return0; } 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");