首页 > 系统相关 >多进程拷贝数据文件

多进程拷贝数据文件

时间:2024-02-26 21:57:22浏览次数:27  
标签:fp 数据文件 pid argv 进程 拷贝 include size

多进程拷贝数据

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int mmap_mamcpy(char **argv)
{
    int fp=open(argv[1],O_RDONLY);
    if(fp<0)
    {
        printf("文件打开失败\n");
        return 0;
    }
    int new_fp=open(argv[2],O_RDWR|O_CREAT,0666);
    if(new_fp<0)
    {
        printf("新文件打开失败\n");
        return 0;
    }
    //计算文件大小
    struct stat buf;
    fstat(fp,&buf);
    if (buf.st_size<=0) return 0;
    //设置新文件大小
    ftruncate(new_fp,buf.st_size);
    //文件映射
    unsigned char *str_fp=mmap(NULL,buf.st_size,PROT_READ,MAP_SHARED,fp,0);
    close(fp);
    if(str_fp==(void *)-1)
    {
        printf("文件映射失败\n");
        return 0;
    }
    //文件映射
    unsigned char *str_new_fp=mmap(NULL,buf.st_size,PROT_READ|PROT_WRITE,MAP_SHARED,new_fp,0);
    close(new_fp);
    if(str_new_fp==(void *)-1)
    {
        printf("新文件映射失败\n");
        return 0;
    }
    int size=buf.st_size/5;    //平均分配每个子进程拷贝的大小
    int father_size=buf.st_size%5;
    int i=0;
    for(i=0;i<5;i++)
    {
        if(fork()==0)   break;;
    }
    if (i<5)
    {
        memcpy(str_new_fp+i*size,str_fp+i*size,size);
    }
    else
    {
        if(father_size>0)
        {
            memcpy(str_new_fp+i*size,str_fp+i*size,size);
        }
        pid_t pid;
        while(1)
        {
            pid=wait(NULL);
            if(pid<0)
                break;
            printf("%d子进程拷贝成功\n",pid);
        }
        munmap(str_new_fp,buf.st_size);
        munmap(str_fp,buf.st_size);
    }
}
int main(int argc, char **argv)
{
    if(argc!=3)
    {
        printf("请输入<.\a.out> [文件1] [文件2]\n");
        return 0;
    }
    mmap_mamcpy(argv);
    return 0;
}

标签:fp,数据文件,pid,argv,进程,拷贝,include,size
From: https://www.cnblogs.com/yesiming/p/18035650

相关文章

  • 火绒误杀桌面进程的解决方法
    由于某大厂的奇葩代码操作,有概率会出现双显示器黑屏(出现请去买彩票),但可以调出任务管理器的问题。(Win1022h2/新安装电脑) 可以通过以下方法解决 方法一、(亲测有效)1、调用任务管理器,打开火绒主运行窗口1.1、Ctrl+Shift+ESC调用任务管理器1.2、在任务管理器中,点击“文件......
  • 零拷贝,mmap 和 sendFile
    传统的IOmmapmmap是一种内存映射技术,mmap相比于传统的IO来说,其实就是少了1次CPU拷贝而已,上图。sendFile在Linux中,提供sendFile函数,实现了零拷贝......
  • linux使用except和子进程交互
    #!/bin/bash#set-x#FTP服务器信息FTP_HOST="ftp.deepvision-tech.com"FTP_USERNAME="huangbinbin"FTP_PASSWORD="xxxxx."#远程目录和文件REMOTE_DIRECTORY=$1LOCAL_FILE=$2ftp_command="ftp-n$FTP_HOST"check_directory="......
  • java实现scp功能实现目录下所有文件拷贝至指定服务器
    1、添加pom依赖<dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version></dependency>2、示例代码publicstaticvoidmain(String[]args)throwsIOException{try{......
  • C++ 拷贝构造函数简单测试
    浅拷贝静态数组的空间体现深拷贝的效果#include<iostream>#include<string>usingnamespacestd;#defineSEX_SIZE10classStudent{public:Student(stringname){Age=10;Name=newstring(name);strcpy(Sex,"男");......
  • python基础学习8-网络协议、进程与线程
    UDP协议用户数据包协议socketbind()sendall()recvfrom()sendto()close()TCP服务器端流程:使用socket类创建一个套接字对象使用bind((ip,port))方法绑定ip地址和端口号使用listen()方法开始TCP监听使用accept()方法等待客户端的连接使用recv()/send()方法接受发送......
  • 文件自动拷贝到桌面及设置桌面显示此电脑
    uname="$env:USERPROFILE"$uname=$uname.Substring($uname.length-8)$checkpath=test-path\\xx.xx.xxx.xxx\xx\xx\*.lnkif($checkpath-eq"True"){copy-item\\xx.xx.xxx.xxx\xx\xx\*.*-destination\\xxx\xx$\$uname......
  • 2024-02-22-物联网系统编程(3-进程)
    3.进程3.1进程概述3.1.1进程的定义程序:存放在存储介质上的可执行文件进程:程序的执行实例,包括程序计数器、寄存器和变量的当前值程序是静态的,进程是动态的。程序是一些执行的有序集合,而进程是程序执行的过程;进程状态是变化的,有创建、调度和消亡。在linux系统中,进程是管理事......
  • 父子进程
    父子进程#include<sys/types.h>#include<unistd.h>#include<stdio.h>#include<stdlib.h>#include<sys/wait.h>intmain(void){ inti=0,j=0,k=0,n=0;; pid_tpid[5]; pid_tpid_d[5]; pid_tpid_d_cpy[5]; pid_tpid_cpy[5]; pi......
  • 在k8S中,如何实现Pod中容器的文件和宿主机之间相互拷贝?
    在Kubernetes(k8S)中,要实现Pod中容器的文件与宿主机之间的相互拷贝,可以使用kubectlcp命令。以下是具体的命令格式和用法:从Pod中复制文件到本地(宿主机):kubectlcp[NAMESPACE/]POD:CONTAINER_PATHLOCAL_FILEPATH例如,将名为my-pod的Pod中,容器内的/path/to/file-i......