IO DAY5

该程序定义了一个结构体用于存储源文件、目标文件路径及拷贝范围,实现了一个函数计算文件长度,以及一个线程函数进行文件拷贝。在主函数中,根据输入参数创建两个线程,分别拷贝文件的一半内容,实现了文件的并行分段复制。
摘要由CSDN通过智能技术生成
线程完成拷贝:

#include <myhead.h>
//定义一个结构体
struct info
{
    const char *srcfile;
    const char *destfile;
    int start;
    int size;
};
//len
int file_len(const char *srcfile,const char *destfile)
{
    int sfd,dfd,len;
    if((sfd = open(srcfile,O_RDONLY)) == -1)
    {
        perror("open error");
        return -1;
    }
   if((dfd = open(destfile,O_WRONLY | O_CREAT | O_TRUNC),0664) == -1)
    {
        perror("open error");
        return -1;
    }

    len = lseek(sfd,0,SEEK_END);
    close(sfd);
    close(dfd);
    return len;
}
//线程体
void *file_copy(void *sp)
{
    struct info *arg=(struct info *)sp;
    int sfd,dfd;
    if((sfd = open(arg->srcfile,O_RDONLY)) == -1)
    {
        perror("open error");
    }
    if((dfd = open(arg->destfile,O_WRONLY)) == -1)
    {
        perror("open error");
    }

    lseek(sfd,arg->start,SEEK_SET);
    lseek(dfd,arg->start,SEEK_SET);
    char buf[256]="";
    int count = 0;
    while(1)
    {
    int    ret = read(sfd,buf,sizeof(buf));
    count+=ret;
    if(ret == 0 || count > arg->size)
    {
        write(dfd,buf,ret - (count - arg->size));
        break;
    }
    write(dfd,buf,sizeof(buf));
    }

}

int main(int argc, const char *argv[])
{
    //长度
    int len;
    len = file_len(argv[1],argv[2]);
    printf("len = %d\n",len);

    //定义一个结构体数组
    struct info s[2]={{argv[1],argv[2],0,len/2},{argv[1],argv[2],len/2,len-len/2}};


    //定义一个线程号
    pthread_t tid,tid1;

    //线程1
    if(pthread_create(&tid,NULL,file_copy,&s[0]))
    {
        perror("create error");
        return -1;
    }

    //线程2
    if(pthread_create(&tid1,NULL,file_copy,&s[1]))
    {
        perror("create error");
        return -1;
    }

    while(1);

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值