復制一個大的文本文件,文件內容你自己准備。要求是文本,10M以上。
(可以寫一段文本,然後cat反復追加擴大文本)
程序運行的形式:輸入命令和參數 $my_copy from_name to_name bufsize(數字)
根據不同的bufsize統計,my_copy的運行時間,給出分析結果,分析原因。
測試運行my_copy時,需要同步收集vmstat 1 的輸出內容重定向到 log.txt 中。
bufsize:
1
32
64
128
256
512
1024
提示:這個程序是無法用windows開發出來的。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <unistd.h>
void tv_sub(struct timeval *end, struct timeval *begin) //計算時間差,將結果存在end裡面
{
if((end->tv_usec-=begin->tv_usec)<0)
{
--end->tv_sec;
end->tv_usec += 1000000;
}
end->tv_sec -= begin->tv_sec;
}
int main(int argc, char *argv[])
{
typedef struct timeval TIME;
TIME begin, end;
gettimeofday(&begin, NULL);
int f_read, f_write, num;
const int BUFSIZE = atoi(argv[3]);
char buf[BUFSIZE];
if (argc != 4)
{
printf("usage: my_read filename1 filename2 bufsize\n");
exit(1);
}
if ((f_read = open(argv[1], O_RDONLY)) < 0)
{
printf("cannot open file %s\n", argv[1]);
exit(1);
}
if ((f_write = open(argv[2], O_WRONLY|O_CREAT, 0644/*S_IREAD|S_IWRITE|S_IEXEC*/)) < 0)
{
printf("cannot open file %s\n", argv[2]);
exit(1);
}
while ((num = read(f_read, buf, BUFSIZE)) > 0)
{
if (write(f_write, buf, num) != num)
{
printf("write error!\n");
close(f_write);
exit(1);
}
}
if (num < 0)
{
printf("read error!\n");
exit(1);
}
gettimeofday(&end, NULL);
tv_sub(&end, &begin);
printf("BUFSIZE=%d\ttime cost: %u:%u\n", BUFSIZE, end.tv_sec, end.tv_usec);
return 0;
}
//***************************************
#makefile
#注意命令行要以TAB開頭,這裡是空格
OBJ = main.o
my_copy : $(OBJ)
cc -o $@ $(OBJ)
main.o : main.c
cc -c main.c
clean:
rm my_copy $(OBJ)
//**************************************
#shell實例程序,復制 000.txt 為 001.txt
#!/bin/sh
#vmstat.sh
echo "begin vmstat 1..."
vmstat 1 >> log.txt &
echo "begin read file..."
i=1
while [ $i -le 1024 ]
do
#echo "BUFSIZE is $i"
./my_copy 000.txt 001.txt $i
i=`expr $i \* 2`
done
pid=`ps | grep vmstat | awk '{print $1}'`
kill $pid