📄 2.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 len,n,k,size,i,fd,loop;
char *buff;
clock_t start,end;
struct tms tmsstart,tmsend;
float utime,stime,ctime;
if(argc==2)//当有两个参数的时候,即异步执行时
{
if((fd=open(argv[1],O_RDWR | O_CREAT|O_TRUNC,FILE_MODE))<0)//以只写方式打开文件,若没则创建该文件,若存在则打开并将其长度截短为0
{
err_sys("open error!!!\n");
}
}
else if(argc==3)//当有三个参数,即同步执行时
{
if(strcmp(argv[2],"sync")!=0)//输入非法,第二个参数不是sync
{
err_sys("input error!!!\n");
}
else if((fd=open(argv[1],O_RDWR |O_CREAT |O_SYNC|O_TRUNC,FILE_MODE)) <0)//以只写方式打开文件,若没则创建该文件,若存在则打开并将其长度截短为0,使每次write都等到物理I/O操作完成
{
err_sys("open error!!!\n");
}
}
else //输入错误
{
err_sys("input error!\n");
}
if((len=lseek(STDIN_FILENO,0,SEEK_END))<0)//获取输入文件的长度
{
err_sys("Lseek error!\n");
}
if(lseek(STDIN_FILENO,0,SEEK_SET)==-1)//定位到输入文件的开头
{
err_sys("Lseek error!\n");
}
printf("\nThe length of file is :%d\n",len);
if((buff=(char *)malloc(sizeof(char)*len))==NULL)//开辟一个与输入文件长度相同的缓冲区
{
err_sys("malloc error\n");//分配不成功返回
}
if(read(STDIN_FILENO,buff,len)<0)//把输入文件的内容读到缓冲区里
{
err_sys("Read error\n");
}
k=sysconf(_SC_CLK_TCK);
printf("BUFFSIZE\tUSER\t\tSYSTEM\t\tCLOCK\t\tLOOP\n");
for(size=1024;size<=131072;size*=2)//分配给不同的buf不同的长度
{
lseek(fd,0,SEEK_SET); //将输出文件的写位置复位到输出文件的开头
start=times(&tmsstart);//记录下开始时间
n=len/size;
loop=0;//计算循环的次数
for(i=1;i<=n;i++,loop++)
if( write(fd,buff+(i-1)*size, size)!=size) //从buf里将size大小的内容写进输出文件里
err_sys("error write!!!\n");
if(write(fd,buff+n*size, len%size)!=len%size)//文件的长度不是size的整数倍时将剩余的输出到文件中
err_sys("error write!!!\n");
loop++;
end=times(&tmsend); //记录下结束时间
ctime=(float)(end-start)/k;//clock
utime=(float)(tmsend.tms_utime -tmsstart.tms_utime)/k;//用户CPU时间
stime=(float)(tmsend.tms_stime -tmsstart.tms_stime)/k; //系统调用CPU时间
printf("%ld\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",size,utime,stime,ctime,loop);
}
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -