一、相关练习
1.使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源
1.1> file_copy_thread.c
#include <myhead.h>
//定义结构体
typedef struct
{
int key; //自定义分支线程号
const char *src; //源文件名
const char *dest; //目标文件名
}Copy;
//判断源文件长度,同时创建目标文件
int file_size(const char *src, const char *dest)
{
//打开源文件|只读
int sfd = open(src, O_RDONLY);
if(-1 == sfd)
{
perror("open error");
return -1;
}
//打开目标文件|只写
int dfd = open(dest, O_WRONLY|O_CREAT|O_TRUNC, 0664);
if(-1 == dfd)
{
perror("open error");
return -1;
}
//获取源文件文件长度
int size = lseek(sfd, 0, SEEK_END);
//关闭文件
close(sfd);
close(dfd);
return size;
}
//拷贝文件函数
void file_copy(const char *src, const char *dest, int start, int len)
{
//打开源文件|只读
int sfd = open(src, O_RDONLY);
if(-1 == sfd)
{
perror("open srcfile error");
return;
}
//打开目标文件|只写
int dfd = open(dest, O_WRONLY);
if(-1 == dfd)
{
perror("open destfile error");
return;
}
//移动文件光标
lseek(sfd, start, SEEK_SET);
lseek(dfd, start, SEEK_SET);
//文件拷贝准备
char buf[128] = ""; //拷贝搬运工
int res = 0; //单次成功拷贝个数
int count = 0; //累计成功拷贝个数
//开始拷贝
while(1)
{
res = read(sfd, buf, sizeof(buf));
count += res;
if(res==0 || count > len) //拷贝完成出口
{
write(dfd, buf, res-(count-len));
break;
}
write(dfd, buf, res);
}
//关闭文件
close(sfd);
close(dfd);
}
//线程体函数
void *task(void *arg)
{
//判断源文件长度
int len = file_size(((Copy*)arg)->src, ((Copy*)arg)->dest);
//判断传过来的信息
if(((Copy*)arg)->key == 1)
{
//线程1执行的内容,拷贝源文件前一半内容
file_copy(((Copy*)arg)->src, ((Copy*)arg)->dest, 0, len/2);
printf("线程1拷贝完成\n");
//退出线程
pthread_exit(NULL);
}else if(((Copy*)arg)->key == 2)
{
//线程2执行的内容,拷贝源文件后一半内容
file_copy(((Copy*)arg)->src, ((Copy*)arg)->dest, len/2, len-(len/2));
printf("线程2拷贝完成\n");
//退出线程
pthread_exit(NULL);
}
else
{
perror("thread create error");
return NULL;
}
}
/*****主程序*****/
int main(int argc, const char *argv[])
{
//判断传入文件个数
if(argc != 3)
{
perror("input file error");
return -1;
}
//定义线程变量
pthread_t tid1, tid2;
//创建参数结构体
Copy c1 = {1, argv[1], argv[2]},
c2 = {2, argv[1], argv[2]};
//创建两个线程
if(pthread_create(&tid1, NULL, task, &c1) != 0)
{
printf("tid1 创建失败\n");
return -1;
}
if(pthread_create(&tid2, NULL, task, &c2) != 0)
{
printf("tid2 创建失败\n");
return -1;
}
//阻塞等待线程的结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
return 0;
}
1.2> 程序实现效果
二、思维导图
1.多进程编程
2.线程支持函数(多线程编程)