📄 timewrite.c
字号:
#include "apue.h"
#include <sys/times.h>
#include <malloc.h>
#include <fcntl.h>
#include<string.h>
#include<stdio.h>
int main(int argc,char *argv[])
{
int length,n,dida,size,i,fout,loop;
char *buff;
clock_t cstart,cend;
struct tms sstart,send;
float utime,stime,ctime;
if(argc!=2&&argc!=3){
printf("input error!!\n");
exit(-1);
}
if(argc==2){//当有两个参数的时候,即异步执行时
if((fout=open(argv[1],O_RDWR | O_CREAT|O_TRUNC,FILE_MODE))<0){
printf("open error!!!\n");
exit(1);
}
}
else if(argc==3){//当有三个参数,即同步执行时
if(strcmp(argv[2],"sync")!=0){//输入非法,第二个参数不是sync
printf("input error!!!\n");
exit(1);
}
else if((fout=open(argv[1],O_RDWR |O_CREAT |O_SYNC|O_TRUNC,FILE_MODE)) <0){
printf("open error!!!\n");
exit(1);
}
}
if((length=lseek(STDIN_FILENO,0,SEEK_END))<0){//用lseek计算文件的长度
printf("Lseek error!\n");
}
if(lseek(STDIN_FILENO,0,SEEK_SET)==-1)//定位到输入文件的开头
{
printf("Lseek error!\n");
}
printf("\nThe length of file is :%d\n",length);
if((buff=(char *)malloc(sizeof(char)*length))==NULL){//分配给buff长度为输入文件长度的字节
printf("Malloc error\n");//分配不成功返回
exit(1);
}
if(read(STDIN_FILENO,buff,length)<0){//将输入文件读入到buff中
printf("Read error\n");
exit(1);
}
printf("BUFFSIZE\tUSER\t\tSYSTEM\t\tCLOCK\t\tLOOP\n");
for(size=1024;size<=131072;size*=2){//分配给不同的buff不同的长度
lseek(fout,0,SEEK_SET);//重新将文件定位到开头
cstart=times(&sstart);
n=length/size;
loop=0;//loop为计算循环的次数
for(i=1;i<=n;i++,loop++)
if( write(fout,buff+(i-1)*size, size)!=size)//按照不同的size将buff读入到输出文件中
err_sys("error write!!!\n");
if(write(fout,buff+n*size, length%size)!=length%size)//文件的长度不是size的整数倍时将剩余的输出到文件中
err_sys("errora write!!!\n");
loop++;
cend=times(&send);
dida=sysconf(_SC_CLK_TCK);
ctime=(float)(cend-cstart);//clock
utime=(float)(send.tms_utime -sstart.tms_utime);//usertime
stime=(float)(send.tms_stime -sstart.tms_stime); //system time
printf("%ld\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",size,utime/dida,stime/dida,ctime/dida,loop);
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -