同步写与异步写文件实现

/*
 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);

 

你可能感兴趣的:(同步写与异步写文件实现)