当前位置: 首页 > news >正文

子进程、父进程

#include <myhead.h>
int main(int argc, const char *argv[])
{if (argc!=3){fprintf(stderr,"输入错误:%s <源文件> <目标文件>\n",argv[0]);exit(EXIT_FAILURE);}//打开源文件int fd=open(argv[1],O_RDONLY);if(fd==-1){perror("open error");exit(EXIT_FAILURE);}//计算源文件大小//把光标移到文件末尾off_t size=lseek(fd,0,SEEK_END);//返回光标所在位置//失败返回-1;if(size==-1){perror("error seek file");close(fd);exit(EXIT_FAILURE);}//计算一半的数int helf_size=size/2;//创建目标文件int fd1=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0644);                                                                                                                                                                                  if(fd1==-1){perror("open error");close(fd);exit(EXIT_FAILURE);}//创建第一个子进程pid_t pid=fork();if(pid==-1){perror("create error");close(fd);close(fd1);exit(EXIT_FAILURE);}if(pid==0){//把文件光标移到文件开始lseek(fd,0,SEEK_SET);lseek(fd1,0,SEEK_SET);//定义一个缓冲区char buffer[20]="";//读取并写入前半部分int byte_read;while((byte_read=read(fd,buffer,sizeof(buffer)<helf_size?sizeof(buffer):helf_size))>0){write(fd1,buffer,byte_read);}exit(EXIT_FAILURE);}//创建第二个子进程pid_t pid1=fork();if(pid1==-1){perror("create error");close(fd);close(fd1);exit(EXIT_FAILURE);}if(pid1==0){//把光标位置移到文件一半的位置lseek(fd,helf_size,SEEK_SET);lseek(fd1,helf_size,SEEK_SET);//把文件后半部分读取到argv[2]文件中int temp=size-helf_size;int byte_read;char buffer[20];while((byte_read=read(fd,buffer,sizeof(buffer)<temp?sizeof(buffer):temp))>0){write(fd1,buffer,byte_read);}exit(EXIT_FAILURE);}//关闭文件close(fd);close(fd1);//回收两个子进程waitpid(pid,NULL,0);waitpid(pid1,NULL,0);return 0;
}
#include <myhead.h>int main(int argc, const char *argv[])
{if(argc!=3){printf("Usage: %s <源文件> <目标文件>\n",argv[0]);exit(EXIT_FAILURE);}//打开源文件int fd=open(argv[1],O_RDONLY);if(fd==-1){perror("open error");exit(EXIT_FAILURE);}//获取源文件的大小//把光标移到文件结尾位置,lseek函数,成功返回光标的当前位置,失败返回-1,并置位错误码off_t size=lseek(fd,0,SEEK_END);off_t helf_size=size/2;if(size==-1){perror("error");close(fd);exit(EXIT_FAILURE);                                                                                                                  }//创建目标文件int fd1=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,0664);if(fd1==-1){perror("open error");close(fd1);exit(EXIT_FAILURE);}//创建子进程pid_t pid=fork();if(pid==-1){perror("create error");exit(EXIT_FAILURE);}if(pid>0)//父进程处理前半部分{//把源文件光标移到文件开头lseek(fd,0,SEEK_SET);//把目标文件光标移动文件开头lseek(fd1,0,SEEK_SET);//读取前半部分并写入char arr[50]="";int byte_read;while(helf_size>0&&(byte_read=read(fd,arr,sizeof(arr)<helf_size ? sizeof(arr):helf_size))>0){write(fd1,arr,byte_read);}close(fd);close(fd1);exit(EXIT_FAILURE);}else if(pid==0)//子进程处理后半部分{//把光标移到文件一半的位置lseek(fd,size/2,SEEK_SET);lseek(fd1,size/2,SEEK_SET);char arr[50]="";int byte_read;int temp=size-helf_size;while((byte_read=read(fd,arr,sizeof(arr)<temp?sizeof(arr):temp))>0){write(fd1,arr,byte_read);}close(fd);close(fd1);exit(EXIT_FAILURE);}return 0;
}

http://www.dtcms.com/a/363828.html

相关文章:

  • 高效数据传输的秘密武器:Protobuf
  • Linux系统:进程信号的处理
  • TKDE-2022《Low-Rank Linear Embedding for Robust Clustering》
  • 【机器学习深度学习】向量模型与重排序模型:RAG 的双引擎解析
  • 利用 Java 爬虫获取淘宝商品 SKU 详细信息实战指南
  • keycloak中对接oidc协议时设置prompt=login
  • 机器学习回顾——决策树详解
  • SOL中转转账教程
  • Android Binder 驱动 - Media 服务启动流程
  • TiDB v8.5.3 单机集群部署指南
  • rocketmq启动与测试
  • 数据结构--跳表(Skip List)
  • playwright+python UI自动化测试中实现图片颜色和像素对比
  • 便携式显示器怎么选?:6大关键指标全解析
  • 【三班网】初三大事件
  • ELK 统一日志分析系统部署与实践指南(上)
  • 【C++上岸】C++常见面试题目--数据结构篇(第十七期)
  • Oracle 数据库与操作系统兼容性指南
  • LeetCode 31. 下一个排列
  • 机器人抓取中的力学相关概念解释
  • Crawl4AI:为LLM而生的下一代网页爬虫框架
  • 【机器学习入门】5.2 回归的起源——从身高遗传到线性模型的百年演变
  • 学习笔记 | 如何将MaxKB应用对外发布为MCP服务?
  • 嵌入式学习 51单片机基础
  • 数控机床相邻轨迹最大过渡速度计算方法介绍
  • 25 万/秒写入 + 70% 硬件节省,TDengine 在首自信工业时序数据平台中的落地
  • 别再误会了!Redis 6.0 的多线程,和你想象的完全不一样
  • 蒙特卡洛采样与粒子滤波算法学习
  • DP-观察者模式代码详解
  • 代码随想录笔记-回溯算法