Linux&C语言简单实现双线程拷贝-文件IO实现

C语言实现双线程文件拷贝
该博客介绍了一段使用C语言编写的代码,实现了通过双线程进行文件拷贝的功能。代码中包含了文件的打开、读取、写入以及线程的创建和同步。主要涉及文件IO操作、系统调用如lseek、read和write,以及pthread库的使用。

1. 基于C语言实现,文件IO练习

2. 代码实现

#include <stdio.h> // Shift  +  Alt  + F     实现代码的对齐;

/* open函数的头文件---文件IO*/
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

/*exit*/
#include <stdlib.h>

/*pthread_create创建线程,pthread_join*/
#include <pthread.h>

/* lseek函数的头文件---文件IO*/
//#include <sys/types.h>
#include <unistd.h>

typedef struct
{
    const char *src;  // argv[1]
    const char *dest; // argv[1]
    int start;        //光标开始位置
    int len;          //需要向后读取个数
} info_t;
/*计算要拷贝文件字符个数*/
int get_src_file_len(const char *srcfile, const char *destfile)
{
    int sfd, dfd;
    int len = 0;
    //打开目标要拷贝的文件
    if ((sfd = open(srcfile, O_RDONLY)) == -1)
    { //只读
        printf("open srcfile error");
    }
    //打开存放拷贝的文件
    if ((dfd = open(destfile, O_RDWR | O_CREAT | O_TRUNC, 0664)) == -1)
    {
        //读写| 创建文件| 清空文件
        printf("open destfile error");
    }
    //读取目标要拷贝的文件的字节数
    len = lseek(sfd, 0, SEEK_END);

    close(sfd); //关闭文件
    close(dfd);

    return len;
}
/*双线程拷贝文件*/
int copy_file(const char *srcfile, const char *destfile, int start, int len)
{
    int sfd, dfd;
    char buf[10] = {0};//临时存放数组
    int ret = 0;
    //记录已经读取字节数
    int i = 0;
    //打开目标要拷贝的文件
    if ((sfd = open(srcfile, O_RDONLY)) == -1)
    { //只读
        printf("open srcfile error");
    }
    //打开存放拷贝的文件
    if ((dfd = open(destfile, O_RDWR)) == -1)
    { //读写
        printf("open destfile error");
    }
    //光标从头开始,移动start
    lseek(sfd, start, SEEK_SET);
    lseek(dfd, start, SEEK_SET);

    while (1)
    {
        ret = read(sfd, buf, sizeof(buf));

        i += ret; //记录已经读取字节数
        //结尾||读多了
        if (ret == 0 || i > len)
        {
            write(dfd, buf, ret - (i - len));
            break;
        }
        write(dfd, buf, ret);
    }
    close(sfd);
    close(dfd);
    return 0;
}
//线程体函数
void *task(void *arg)
{
    info_t f = *(info_t *)arg;
    /*双线程拷贝文件*/
    copy_file(f.src, f.dest, f.start, f.len);
    pthread_exit(NULL); //退出线程
}

int main(int argc, const char *argv[])
{
    //检测命令行 3个参数
    if (argc != 3)
    {
        //定向输出错误
        fprintf(stderr, "input error,try again\n");
        fprintf(stderr, "usage:./a.out srcfile,destfile\n");
        exit(EXIT_FAILURE);
    }
    /*计算要拷贝文件字符个数*/
    int len= get_src_file_len(argv[1], argv[2]);

    //结构体赋值
    info_t f[] = {
        {argv[1], argv[2], 0, len / 2},
        {argv[1], argv[2], len / 2, (len - len / 2)},
    };
    //新建子线程
    pthread_t tid1, tid2; 
    if (pthread_create(&tid1, NULL, task, (void *)&f[0]))
        printf("thread 1 create error");

    if (pthread_create(&tid2, NULL, task, (void *)&f[1]))
        printf("thread 2 create error");
	//阻塞等待线程结束,并为线程收尸
    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);

    return 0;
}
执行结果

在这里插入图片描述

6. 非原创

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值