5月31号作业

请添加图片描述

双线程拷贝图片

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <pthread.h>

typedef struct FileInfor            //定义结构体,批量向线程中传递信息
{
    char suorcefile[32];            //要拷贝的文件名
    char destfile[32];              //要拷贝到的文件名
    ssize_t len;                    //文件内容长度
    ssize_t Start;                  //拷贝起始位置
}FileTyp;

ssize_t Get_Len(const char *suorcefile,const char *destfile)
{
    int fd1,fd2;
    ssize_t len;
    if((fd1=open(suorcefile,O_RDONLY))==-1)  //只读形式打开第一个文件
    {
        perror("open file");
        return -1;
    }
    if((fd2=open(destfile,O_RDWR|O_CREAT|O_TRUNC,0666))==-1)//读写形式打开第二个文件
    {
        perror("open file");
        return -1;
    }

    len=lseek(fd1,0,SEEK_END);          //获得文件内容长度

    close(fd1);                         //关闭文件
    close(fd2);
    return len;
}

int Cpy_File(const char *suorcefile,const char *destfile,ssize_t Start_Num,ssize_t len)
{
    int fd1,fd2;
    if((fd1=open(suorcefile,O_RDONLY))==-1)  //只读形式打开第一个文件
    {
        perror("open file");
        return -1;
    }
    if((fd2=open(destfile,O_RDWR))==-1)//读写形式打开第二个文件
    {
        perror("open file");
        return -1;
    }
    lseek(fd1,Start_Num,SEEK_SET);      //置位光标位置至起始位置
    lseek(fd2,Start_Num,SEEK_SET);
    char Buf[32]="";                    //用于临时存数据
    char n;
    while(len>0)                        //拷贝完成条件
    {
        n=read(fd1,Buf,sizeof(Buf));    //返回每次读取的字节数
        write(fd2,Buf,n);               //写入相应的字节数
        len=len-n;                      //拷贝总长减去每次拷贝的字节数
    }

    close(fd1);                         //关闭文件
    close(fd2);
    return 0;
}

void *task1(void *arg)                  //线程1,拷贝后半段
{
    FileTyp *p=(FileTyp *)arg;
    Cpy_File(p->suorcefile,p->destfile,p->Start,p->len);
    pthread_exit(NULL);
}

void *task2(void *arg)                  //线程2,拷贝前半段
{
    FileTyp *p=(FileTyp *)arg;
    Cpy_File(p->suorcefile,p->destfile,p->Start,p->len);
    pthread_exit(NULL);
}

int main()
{
    ssize_t len,ret;
    len=Get_Len("long.jpg","Text.jpg");     //获取文件内容长度
    printf("file size : %ld\n",len);
    ret=len/2-(len/2)%32;                   //计算前半段长度,为数组的整数倍
    FileTyp CpyFork1={"long.jpg","Text.jpg",len-ret,ret};//分两段拷贝,填入两个文件名,
    FileTyp CpyFork2={"long.jpg","Text.jpg",ret,0};      //拷贝的起始位置和长度
    pthread_t tid1,tid2;
    if(pthread_create(&tid1,NULL,task1,&CpyFork1)==-1)   //初始化进程1
    {
        perror("create tid error");
        return -1;
    }
    if(pthread_create(&tid2,NULL,task2,&CpyFork2)==-1)   //初始化进程2
    {
        perror("create tid error");
        return -1;
    }

    pthread_join(tid1,NULL);            //等待回收进程资源
    pthread_join(tid2,NULL);

    return 0;
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值