#include <myhead.h>
sem_t sem;
struct filedata
{
char fileread[20];
char filewrite[20];
int len;
};
int get_file_len(const char *srcfile, const char *destfile)
{
int rd = open(srcfile, O_RDONLY);
if(rd == -1)
{
perror("open file error");
return -1;
}
int wr = open(destfile, O_WRONLY|O_CREAT|O_TRUNC, 0664);
if(wr == -1)
{
perror("create file error");
return -1;
}
int len = lseek(rd, 0, SEEK_END);
close(rd);
close(wr);
return len;
}
void copy_file(const char *srcfile, const char *destfile, int start, int len)
{
//以只读形式打开文件
int rd = open("admin.txt", O_RDONLY);
if(rd == -1)
{
perror("open file error");
return;
}
int wr = open("admin2.txt", O_WRONLY);
if(wr == -1)
{
perror("create file error1");
return;
}
lseek(rd, start, SEEK_SET);
lseek(wr, start, SEEK_SET);
char buf[128] = "";
int sum = 0;
int pid = getpid();
while(1)
{
bzero(buf, sizeof(buf));
int res = read(rd, buf, sizeof(buf));
sum += res;
if(res==0 || sum>=len)
{
write(wr, buf, res-(sum-len));
break;
}
write(wr, buf, res);
}
close(rd);
close(wr);
}
void *task1(void *arg)
{
struct filedata file1;
sem_post(&sem);
copy_file(file1.fileread, file1.filewrite, 0, file1.len/2);
printf("前半复制成功\n");
pthread_exit(NULL);
}
void *task2(void *arg)
{
struct filedata file1;
sem_wait(&sem);
copy_file(file1.fileread, file1.filewrite, file1.len/2, (file1.len+1)/2);
printf("后半复制成功\n");
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//判断是否传入三个文件
if(argc != 3)
{
printf("input file error");
return -1;
}
int len = get_file_len(argv[1], argv[2]);
printf("长度为%d\n", len);
sem_init(&sem, 0, 0);
struct filedata file1;
strcpy(file1.fileread, argv[1]);
strcpy(file1.filewrite, argv[2]);
file1.len = len;
pthread_t tid1, tid2;
if(pthread_create(&tid1, NULL, task1, &file1)!=0)
{
printf("线程创建失败\n");
return -1;
}
if(pthread_create(&tid2, NULL, task2, &file1)!=0)
{
printf("线程创建失败\n");
return -1;
}
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf("回收完毕!");
sem_destroy(&sem);
return 0;
}
09-26
03-02
1132
