用法和之前的那个程序一样
#include<stdio.h>
#include<string.h>
#include<io.h>
#include<omp.h>//使用openmp的头文件
#include<time.h>
#define N 3
#define M 1000
void cp(FILE *S,FILE *d,int l,char tmp[]);
int main(int argc,char *argv[])
{
FILE *s,*d;
char tmp[M];
int i,j;
__int64 lg,l;
clock_t t1,t2;//定义两个时间变量,用来计时用的
l=M;
t1=clock();
//printf("%d/n",l);
if(argc>N)
{
printf("参数异常/n");
return 0;
}
if((argc==1)||((argc==N-1)&&(strcmp(argv[argc-1],"/?")==0)))
{
printf("eg:hd file1 file2 /n");
return 0;
}
if((s=fopen(argv[1],"rb"))==NULL)
{
printf("打开源文件失败/n");
return 0;
}
else
{
printf("打开源文件成功/n");
}
if((d=fopen(argv[2],"rb"))!=NULL)
{
printf("目的文件已存在/n");
fclose(s);
fclose(d);
return 0;
}
if((d=fopen(argv[2],"ab"))!=NULL)
{
printf("创建目的文件成功/n");
}
lg=filelength(fileno(s));
if(lg<=l)
{
//printf("进入lg<=l判断,文件长度为%d个字节/n",lg);
fread(tmp,sizeof(char),lg,s);
fwrite(tmp,sizeof(char),lg,d);
fclose(s);
fclose(d);
return 0;
}
//printf("%d/n",l);
i=j=lg/l;
//printf("/n文件长度%d个字节/n",lg);
omp_set_num_threads(4);//使用4个线程复制文件
omp_lock_t mylock;//定义一个线程锁
omp_init_lock(&mylock);//初始化线程锁
#pragma omp parallel for //schedule(static)
for(i=0;i<j;i++)
{
//printf("/n当前进入第%d次for循,等待复制文件长度为%d个字节/n",j-i+1,lg-l*i);
//printf("本次复制文件长度为%d个字节/n",l);
omp_set_lock(&mylock);//上锁
cp(s,d,l,tmp);
omp_unset_lock(&mylock);//解索
}
omp_destroy_lock(&mylock);//关闭锁
l=lg-l*j;
fread(tmp,sizeof(char),l,s);
fwrite(tmp,sizeof(char),l,d);
fclose(s);
fclose(d);
t2=clock();
printf("/n耗时%d毫秒/n",t2-t1);//输出程序运行时间
return 0;
}
void cp(FILE *s,FILE *d,int l,char tmp[])
{
fread(tmp,sizeof(char),l,s);
fwrite(tmp,sizeof(char),l,d);
}