IO学习系列之使用多进程复制同一个文件内容

  • 实例要求:
  • 使用多进程复制同一个文件内容;
  • 实例分析:
  • 1.创建一个父进程和一个子进程设置光标在指定文件中的偏移量,实现对同一个文件的复制。
  • 2.比如:可以指定子进程复制文件内容的前一半,而父进程复制文件内容的后一半
  • 3.根据时间片轮询法则,最终父进程和子进程可以把同一个文件复制成功。
  • 相关的文件IO接口函数如下:
  • open函数:
#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags, mode_t mode);
/*
功能:使用文件IO打开一个文件参数:pathname:文件的路径和名字flag:O_RDONLY	只读方式打开文件O_WRONLY	只写方式打开文件O_RDWR		读写方式打开文件O_APPEND	以追加的模式打开文件O_CREAT		创建文件  需要使用第三个参数 mode给mode传参最大能传 0666文件最终的权限还与umask掩码有关 umask默认是 0002也可以使用 umask 0666 等修改 一般我们都使用默认值(mode & ~umask)我们创建的普通文件,最高的权限是 06660666 & ~0002 == 0664文件最终的权限 = (mode & ~umask)O_EXCL		需要和O_CREAT配合使用,如果文件不存在则新建,如果存在则报错 错误码EEXISTO_TRUNC		清空文件mode:如果第二个参数指定了O_CREAT 则需要使用第三个参数mode来指定文件访问模式如果第二个参数没有 O_CREAT 则第三个参数可以不写用八进制表示返回值:成功  文件描述符失败  -1  重置错误码
*/
  • close函数:
#include <unistd.h>int close(int fd);
/*
功能:关闭一个文件参数:fd 文件描述符返回值:   成功 0 失败 -1 重置错误码
*/
  • read函数:
#include <unistd.h>ssize_t read(int fd, void *buf, size_t count);
/*
功能:尝试从文件fd中读取count个字节到buf中参数:fd:	文件描述符buf:	用来存储读取内从的缓冲区的首地址count:	想要读取的字节数返回值:成功  	实际读取的字节数,读到文件结尾会返回0失败  	-1  重置错误码
*/
  • write函数:
#include <unistd.h>ssize_t write(int fd, const void *buf, size_t count);/*
功能:尝试把buf中的内容写count个到文件fd中参数:fd:	文件描述符buf:	要写入的数据的首地址count:	想要写入的字节数返回值:成功  	实际写入的字节数 (如果返回0 表示没有写入内容)失败  	-1  重置错误码
*/
  • lseek函数:
#include <sys/types.h>#include <unistd.h>off_t lseek(int fd, off_t offset, int whence);
/*
功能:设置光标的位置参数:fd:文件描述符offset:偏移量>0  向后偏移0  不偏移<0  向前偏移whence:SEEK_SET  相对于文件开头SEEK_CUR  相对于当前位置SEEK_END  相对于文件结尾返回值:成功  返回光标距离文件开头的偏移量失败  -1  重置错误码 
*/
  • fork函数:
#include <sys/types.h>#include <unistd.h>pid_t fork(void);
/*
功能:拷贝父进程,产生子进程参数:无返回值:成功 	给子进程(即返回值等于0)返回0或者给父进程(即返回值大于0)返回子进程的pid失败 	-1 	重置错误码,不会创建子进程  
*/
//注意:在不关心返回值的情况下n次fork会产生2^n个进程 
  • 示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdbool.h>//获取源文件的大小(字节)
//创建目标文件
int get_src_file_size_and_create_dest_file(const char *src_file,const char *dest_file);//复制源文件内容到目标文件内容中
void cp_src_file_to_dest_file(const char *src_file,const char *dest_file,int offset,int size);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 = get_src_file_size_and_create_dest_file(argv[1],argv[2]);//创建进程pid_t pid = 0;if(-1 == (pid = fork())){perror("fork error");return -1;}else if(0 == pid){ //子进程cp_src_file_to_dest_file(argv[1],argv[2],0,size/2);}else if(0 < pid){  //父进程cp_src_file_to_dest_file(argv[1],argv[2],size/2,size - size/2);}return 0;
}int get_src_file_size_and_create_dest_file(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);//创建目标文件int dest_fd = open(dest_file,O_WRONLY | O_CREAT | O_TRUNC,0666);if(-1 == dest_fd){perror("open error");return -1;}return size;}void cp_src_file_to_dest_file(const char *src_file,const char *dest_file,int offset,int size)
{int src_fd = 0;int dest_fd = 0;//打开源文件if(-1 == (src_fd = open(src_file,O_RDONLY))){perror("open error");exit(-1);}//打开目标文件if(-1 == (dest_fd = open(dest_file,O_WRONLY))){perror("open error");exit(-1);}//定位光标lseek(src_fd,offset,SEEK_SET);lseek(dest_fd,offset,SEEK_SET);int ret = 0;int num = 0;char buf[64] = {0};while (true){ret = read(src_fd,buf,sizeof(buf));if(0 == ret){break;}num += ret;if(num > size){write(dest_fd,buf,size - (num - ret));break;}write(dest_fd,buf,ret);}//关闭文件close(src_fd);close(dest_fd);}
  • 运行结果:
linux@ubuntu:~$ gcc proc2.c 
linux@ubuntu:~$ ./a.out k1.c k2.c
linux@ubuntu:~$ diff k1.c k2.c 
linux@ubuntu:~$
  • 本示例代码,仅供参考

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

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

相关文章

nvm 管理 node版本

下载地址 https://nvm.uihtm.com/download.html 基础命令 查看所有可安装的node版本 nvm list available 查看本地已经安装的所有版本&#xff1a; nvm list 安装指定的node版本 nvm install 14.18.1 使用指定node版本 nvm use 14.18.1 卸载指定node版本 nvm uninstall …

【网络编程】UDP数据报套接字编程和TCP流套接字编程

文章目录 1. 网络编程基础1.1 为什么需要网络编程&#xff1f;1.2 网络编程是什么&#xff1f;1.3 概念 2. Socket套接字3. UDP数据报套接字编程3.1 DatagramSocket API3.2 DatagramPacket API3.3 InetSocketAddress API 4. UDP构建服务端客户端&#xff08;一发一收&#xff0…

【Java-LangChain:使用 ChatGPT API 搭建系统-10】评估(下)-当不存在一个简单的正确答案时

第十章&#xff0c;评估&#xff08;下&#xff09;-当不存在一个简单的正确答案时 在上一章中&#xff0c;了解了如何评估 LLM 模型在 有明确正确答案 的情况下的输出&#xff0c;我们可以编写一个函数来判断 LLM 输出是否正确地分类并列出产品。 然而&#xff0c;如果 LLM …

文本分词排序

文本分词 在这个代码的基础上 把英语单词作为一类汉语&#xff0c;作为一类然后列出选项 1. 大小排序 2. 小大排序 3. 不排序打印保存代码 import jieba# 输入文本&#xff0c;让我陪你聊天吧~ lines [] print("请输入多行文本&#xff0c;以\"2333.3\"结束&am…

osg实现鼠标框选

目录 1. 需求的提出 2. 具体实现 2.1. 禁止场景跟随鼠标转动 2.2. 矩形框前置绘制 3. 附加说明 3.1. 颜色设置说明 3.2.矩形框显示和隐藏的另一种实现 1. 需求的提出 有时需要在屏幕通过按住键盘上的某个键如Ctrl键且按住鼠标左键&#xff0c;拖出一个矩形&#xff0c;实现框…

ValueError: check_hostname requires server_hostname

使用jupyter 下载js2py 异常 !pip install js2py ValueError: check_hostname requires server_hostname 一开始以为是数据源问题&#xff0c;切换阿里云 还是这个异常 结果发现是开魔法导致的&#xff0c;关闭魔法即可

Redisson集群管理工具、对Redis节点的操作

一、集群管理工具 Redisson集群管理工具提供了通过程序化的方式&#xff0c;像redis-trib.rb脚本一样方便地管理Redis集群的工具。 1、 创建集群 以下范例展示了如何创建三主三从的Redis集群。 ClusterNodes clusterNodes ClusterNodes.create() .master("127.0.0.1:…

怒刷LeetCode的第23天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 方法二&#xff1a;动态规划 方法三&#xff1a;回溯算法 方法四&#xff1a;并查集 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;排序和遍历 方法二&#xff1a;扫描线算法 方法…

【Java-LangChain:使用 ChatGPT API 搭建系统-3】评估输入-分类

第三章 评估输入-分类 在本章中&#xff0c;我们将重点讨论评估输入任务&#xff0c;这对于确保系统的质量和安全性至关重要。 对于需要处理不同情况下的许多独立指令集的任务&#xff0c;首先对查询类型进行分类&#xff0c;并以此为基础确定要使用哪些指令&#xff0c;具有…

英伟达NVIDIA驱动安装

一般&#xff0c;我们新的显卡上机或者新系统可能就需要重新安装显卡驱动。或者是我们在配置深度学习环境时候&#xff0c;需要手动安装驱动。 官网地址&#xff1a;官方高级驱动搜索 | NVIDIA 我们选择好自己需要的驱动后直接安装即可 下载的时候&#xff0c;选择自己需要的驱…

计算机竞赛 深度学习卷积神经网络垃圾分类系统 - 深度学习 神经网络 图像识别 垃圾分类 算法 小程序

文章目录 0 简介1 背景意义2 数据集3 数据探索4 数据增广(数据集补充)5 垃圾图像分类5.1 迁移学习5.1.1 什么是迁移学习&#xff1f;5.1.2 为什么要迁移学习&#xff1f; 5.2 模型选择5.3 训练环境5.3.1 硬件配置5.3.2 软件配置 5.4 训练过程5.5 模型分类效果(PC端) 6 构建垃圾…

第一篇:数组定义JavaScript

数组的定义 数组是一种特殊的变量&#xff0c;能够用来一次存放一个以上的值。 一维数组的定义 //使用字面量[]方式定义 var arr [1,2,3] console.log(arr)//1,2,3使用构造函数的方式定义 var arr new Array()//定义了一个空数组 var arr new Array(10)//定义了长度为1…

微服务网关:Spring Cloud Zuul 升级 Spring Cloud Gateway 的核心要点

1. 服务路由 1.1. Zuul 接收请求&#xff1a; 在routes路由规则中&#xff0c;根据path去匹配&#xff0c;如果匹配中&#xff0c;就使用对应的路由规则进行请求转发如果无法从routes中匹配&#xff0c;则根据path用“/”去截取第一段作为服务名进行请求转发&#xff0c;转发…

spring-boot 操作 mongodb 数据库

如何使用 spring-boot 操作 mongodb 数据库 配置文件&#xff1a; spring:data:mongodb:host: 127.0.0.1database: fly_articleDbport: 27017# 可以采取 mysql 写法# uri: mongodb://127.0.0.1/fly_articleDb依赖信息: <?xml version"1.0" encoding"UTF-…

JavaSE | 初识Java(一) | JDK \ JRE \ JVM

Java初识 Java 是一门半编译型、半解释型语言。先通过 javac 编译程序把源文件进行编译&#xff0c;编译后生成的 .class 文件是由字节 码组成的平台无关、面向 JVM 的文件。最后启动 java 虚拟机 来运行 .class 文件&#xff0c;此时 JVM 会将字节码转换成平台能够理…

线程的概述

#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 功能&#xff1a;创建一个子线程 参数&#xff1a; -thread:传出参数&#xff0c;线程创建成功后&#xff0c;子线程的ID被写到…

1092:求出e的值

#include <iostream> using namespace std;int main() {//1.定义变量double e 1.0f;double factorial 1.0f;int n 0;//2.输入数据cin >> n;for(int i 1; i < n; i){factorial factorial * i;e 1.0 / factorial;}printf("%.10lf",e);return 0; }…

日常工作报告生成器微信小程序源码 支持日报,周报,月报,年终终结

相信大家上班都会有做工作报告的情况吧 那么这款小程序就是大家的福音了 只要输入你的工作内容或者岗位自动生成你的工作报告 支持报,周报,月报,年终终结 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391810 源码下载2&#xff1a;评论留言或私信…

docker资源控制

一&#xff0c;cpu资源控制 cgroups&#xff0c;是一个非常强大的linux内核工具&#xff0c;他不仅可以限制被 namespace 隔离起来的资源&#xff0c; 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups&#xff08;Control groups&#xff09;实现了对资源…

竞赛选题 机器视觉的试卷批改系统 - opencv python 视觉识别

文章目录 0 简介1 项目背景2 项目目的3 系统设计3.1 目标对象3.2 系统架构3.3 软件设计方案 4 图像预处理4.1 灰度二值化4.2 形态学处理4.3 算式提取4.4 倾斜校正4.5 字符分割 5 字符识别5.1 支持向量机原理5.2 基于SVM的字符识别5.3 SVM算法实现 6 算法测试7 系统实现8 最后 0…