Windows XP Windows 7 Windows 2003 Windows Vista Windows教程綜合 Linux 系統教程
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟件教程
 Windows教程網 >> Linux系統教程 >> Linux教程 >> unix下的my

unix下的my

日期:2017/2/7 14:31:39      編輯:Linux教程
 

復制一個大的文本文件,文件內容你自己准備。要求是文本,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
 

Copyright © Windows教程網 All Rights Reserved