2024.4.21

news2024/11/18 18:30:10

 多进程实现拷贝

#include <myhead.h>
//定义结构体
typedef struct INFO
{
    const char *src_file;
    const char *dest_file;
    int mv;
    int size;

}info_t;

//获取源文件的大小并且创建目标文件
int size_creat(const char *src_file,const char *dest_file)
{
    //获取源文件的大小(字节)
    int src_fd = open(src_file,O_RDONLY);

    if(-1 == src_fd)
    {
        perror("open error");
        return -1;
    }

    int size = lseek(src_fd,0,SEEK_END);

    close(src_fd);

    //创建目标文件

    int dest_fd = open(dest_file,O_WRONLY | O_CREAT | O_TRUNC,0666);

    if(-1 == dest_fd)
    {
        perror("open error");
        return -1;
    }

    close(dest_fd);

    return size;
}

//复制源文件内容到目标文件内容中
void *cp(void *arg)
{
    //强制类型转换
    info_t info = *(info_t *)arg;

    int src_fd = 0;

    int dest_fd = 0;

    //打开源文件
    if(-1 == (src_fd = open(info.src_file,O_RDONLY)))
    {
        perror("open error");
        pthread_exit(NULL);
    }
    //打开目标文件
    if(-1 == (dest_fd = open(info.dest_file,O_WRONLY)))
    {
        perror("open error");
        pthread_exit(NULL);
    }

    //定位光标
    lseek(src_fd,info.mv,SEEK_SET);

    lseek(dest_fd,info.mv,SEEK_SET);

    int ret = 0;
    int num = 0;
    char buf[64] = {0};

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

        if(0 == ret)
        {
            break;
        }

        num += ret;

        if(num > info.size)
        {
            write(dest_fd,buf,info.size - (num - ret));
            break;
        }

        write(dest_fd,buf,ret);
       
    }
    //关闭文件
    close(src_fd);

    close(dest_fd);

}

int main(int argc, char const *argv[])
{
    if(3 != argc)
    {
        printf("Usage : %s src_file dest_file\n",argv[0]);
        return -1;
    }

    int size = 0;

    size = size_creat(argv[1],argv[2]);

    //线程1复制文件内容的前一半
    //线程2复制文件内容的后一半
    info_t arg[2] = {

        {argv[1],argv[2],0,size/2},

        {argv[1],argv[2],size/2,size - size/2}

    };

    pthread_t thread1 = 0;

    pthread_t thread2 = 0;

    int ret = 0;

    //创建线程1
    if(0 != (ret = pthread_create(&thread1,NULL,cp,&arg[0])))
    {
        printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret,strerror(ret));
        exit(EXIT_FAILURE);
    }
    //创建线程2
    if(0 != (ret = pthread_create(&thread2,NULL,cp,&arg[1])))
    {
        printf("pthread_create error : errno = [%d] errstr = [%s]\n",ret,strerror(ret));
        exit(EXIT_FAILURE);
    }

    pthread_join(thread1,NULL);
    pthread_join(thread2,NULL);
    return 0;
}

 

使用多线程完成两个文件的拷贝,第一个线程拷贝前一半,第二个线程拷贝后一半,主线程关闭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1462185.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十二章 C++经验谈(一)

作者对C的基本态度是“练从难处练&#xff0c;用从易处用”&#xff0c;因此本章有几节“负面”的内容。作者坚信软件开发一定要时刻注意减少不必要的复杂度&#xff0c;一些花团锦簇的招式玩不好反倒会伤到自己。作为应用程序的开发者&#xff0c;对技术的运用要明智&#xff…

说一说Eclipse的项目类型和常用项目的区别

Eclipse在新建项目的时候有很多类型&#xff0c;包括Java project、Web project等等&#xff0c;如下&#xff1a; 那么这些项目类型有什么区别呢&#xff1f;我们在创建项目的时候应该如何选择&#xff0c;了解清楚这一点还是非常重要的&#xff0c;但记住一个出发点&#xff…

Simulink算法仿真注意事项

一、背景 首先&#xff0c;需要区分Simulink仿真和FPGA仿真的区别&#xff0c;即使最终算法可能要落地到FPGA上。 Simulink是MATLAB的一个重要组成部分&#xff0c;主要用于建模、仿真等&#xff0c;它可将理论研究和实践有机的相结合&#xff0c;并且用户不需要书写大量的代…

⭐北邮复试刷题LCR 037. 行星碰撞__栈 (力扣119经典题变种挑战)

LCR 037. 行星碰撞 给定一个整数数组 asteroids&#xff0c;表示在同一行的小行星。 对于数组中的每一个元素&#xff0c;其绝对值表示小行星的大小&#xff0c;正负表示小行星的移动方向&#xff08;正表示向右移动&#xff0c;负表示向左移动&#xff09;。每一颗小行星以相…

Elasticsearch:使用 ELSER v2 进行语义搜索

在我之前的文章 “Elasticsearch&#xff1a;使用 ELSER 进行语义搜索”&#xff0c;我们展示了如何使用 ELESR v1 来进行语义搜索。在使用 ELSER 之前&#xff0c;我们必须注意的是&#xff1a; 重要&#xff1a;虽然 ELSER V2 已正式发布&#xff0c;但 ELSER V1 仍处于 [预览…

基于Jenkins实现的CI/CD方案

基于Jenkins实现的CI/CD方案 前言 最近基于Jenkins的基座&#xff0c;搭建了一套适用于我们项目小组的持续集成环境。现在把流程整理分享出来&#xff0c;希望可以给大家提供一些帮助和思路。 使用到的组件和版本 组件名称组件版本作用Harbor2.7.3镜像仓库Jenkins2.319.2持…

【鸿蒙系统学习笔记】网络请求

一、介绍 资料来自官网&#xff1a;文档中心 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 日常…

Adobe将类ChatGPT集成到PDF中

2月21日&#xff0c;全球多媒体巨头Adobe在官网宣布&#xff0c;推出生成式AI助手AI Assistant&#xff0c;并将其集成在Reader 和Acrobat 两款PDF阅读器中。 据悉&#xff0c;AI Assistant的功能与ChatGPT相似&#xff0c;可以基于PDF文档提供摘要、核心见解、基于文档内容&a…

[bing]“gang调度 Kubernetes的并发控制和一致性机制“论点的对应的源码分析

你是一位K8S专家。请分析在Kubernates&#xff08;https://github.com/kubernetes/kubernetes.git&#xff09;项目和调度coscheduling(https://github.com/kubernetes-sigs/scheduler-plugins/tree/master/pkg/coscheduling) 插件中支撑"PodGroup的管理和调度决策涉及到对…

​Fruity Loops Studio21.2.3软件中文版官方功能介绍

​Fruity Loops Studio 21.2 软件功能介绍 一、概述 Fruity Loops Studio&#xff0c;现更名为FL Studio&#xff0c;是一款由Image-Line公司开发的数字音频工作站&#xff08;DAW&#xff09;。该软件广泛用于音乐创作、编曲、录音、混音和制作。FL Studio 21.2是其近期的一…

ARMv8-AArch64 的异常处理模型详解之异常向量表vector tables

目录 一&#xff0c;AArch64 异常向量表 二&#xff0c;栈指针以及SP寄存器的选择 三&#xff0c;从异常返回 一&#xff0c;AArch64 异常向量表 异常向量表&#xff08;vector tables&#xff09;是一组存放于普通内存&#xff08;normal memory&#xff09;空间的&#xf…

JavaWeb——002JS Vue快速入门

目录 一、JS快速入门​编辑 1、什么是JavaScript?​编辑 2、JS引入方式​编辑 2.1、示例代码 3、JS基础语法 3.1、书写语法 3.2、变量​编辑 3.3、数据类型 3.4、运算符​编辑 3.5、流程控制语句​编辑 4、JS函数 4.1、第一种函数定义方式 function funcName(参数…

什么是数组

目录 概念 案例 有变量&#xff0c;为什么还要数组&#xff1f; 概念 数组就是一个容器&#xff0c;用来存一批同种类型的数据。 案例 有变量&#xff0c;为什么还要数组&#xff1f; 1、假设用变量解决时间点名的需求 代码繁琐&#xff1a;大量变量的定义。 实现需求繁琐…

linux platform架构下I2C接口驱动开发

目录 概述 1 认识I2C协议 1.1 初识I2C 1.2 I2C物理层 1.3 I2C协议分析 1.3.1 Start、Stop、ACK 信号 1.3.2 I2C协议的操作流程 1.3.3 操作I2C注意的问题 2 linux platform驱动开发 2.1 更新设备树 2.1.1 添加驱动节点 2.1.2 编译.dts 2.1.3 更新板卡中的.dtb 2.2 …

Win11蓝屏开不了机进入安全模式的快速方法

最近&#xff0c;很多使用Win11电脑的用户都在反映自己遇到了蓝屏问题&#xff0c;这时候想通过进入系统的安全模式&#xff0c;来解决电脑蓝屏的问题&#xff0c;却不知道进入安全模式的具体操作方法&#xff0c;下面给大家介绍最简单快速的进入方法&#xff0c;帮助大家轻松解…

NDK的log.h使用__android_log_print报错app:buildCMakeDebug[x86_64]

org.gradle.api.tasks.TaskExecutionException: Execution failed for task :app:buildCMakeDebug[x86_64] 重点是 Execution failed for task :app:buildCMakeDebug[x86_64]. 我的代码&#xff1a; #include <android/log.h> #define LOG_TAG "MyJNI" #d…

游戏同步+游戏中的网络模块

原文链接&#xff1a;游戏开发入门&#xff08;九&#xff09;游戏同步技术_游戏数据同步机制流程怎么开发-CSDN博客 游戏开发入门&#xff08;十&#xff09;游戏中的网络模块_游戏开发组网-CSDN博客 3.同步技术的基本常识&#xff1a; a.同步给谁&#xff1f;某个用户&…

二叉树基础知识总结

目录 二叉树基础知识 概念 : 根节点的五个形态 : 特殊的二叉树 满二叉树 : 完全二叉树 : 二叉搜索树 : 平衡二叉搜索树 : 二叉树的性质 : 二叉树的存储结构 二叉树的顺序存储结构 二叉树的链式存储结构 二叉树的遍历方式 : 基础概念 前中后遍历 层序遍历 :…

解决Ultra 5 125H处理器核显使用solidworks卡顿问题

硬件环境&#xff1a;机械革命 无界14pro Ultra 5 125H 软件环境&#xff1a;windows11 solidworks2023 现象&#xff1a;在使用solidworks作图时&#xff0c;软件卡顿&#xff0c;鼠标无法拖动模型 解决办法&#xff1a; 1&#xff0c;下载并安装solidworks官方给出的修补程…

c语言经典测试题2

1.题1 我们来思考一下它的结果是什么&#xff1f; 我们来分析一下&#xff1a;\\是转义为字符\&#xff0c;\123表示的是一个八进制&#xff0c;算一个字符&#xff0c;\t算一个字符&#xff0c;加上\0&#xff0c;应该有13个&#xff0c;但是strlen只计算\0前的字符个数。所以…