newplan

阿基米德在洗澡時發現浮力原理,高興得來不及穿㆖褲子,跑到街㆖大喊:Eureka(我找到了)。
posts - 39, comments - 26, trackbacks - 0, articles - 4
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

同步写与异步写文件实现

Posted on 2007-11-21 18:45 山泉弯延 阅读(1180) 评论(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);

 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理