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

Linux 无名管道实现文件复制

无名管道

        通过一个管道(假象)进行传输数据,但是这个管道的传输方式是单工(半双工)的,就是这个管道允许进行发送和接受数据,不过不能同时进行。

创建无名管道

        这里用到一个pipe()函数,参数fd[2]为一个数组,用来保存函数返回的两个文件描述符,将fd[0]视为管道的读端,而fd[1]视为管道的写端。这也意味着,需要通过这两个设定的文件描述符进行读写。

无名管道操作特性

        (1)无名管道只能用于具有亲属关系的进程之间通信(如父子进程)

                        所以要用无名管道,首先需要生成有个父子进程

        (2)对管道的读写可以使用I/O中read()函数、write()函数直接操作文件描述符即可

                         如:write(fd[1],buf,nbyte);

                                read(fd[0],buf,N);

        (3)无名管道本质是内和空间的内存段,不能使用lseek()函数定位。

        (4)一次性操作,一旦管道中存在的数据被读取,管道将会清除被读取的数据。

        (5)大小固定,写满会阻塞。

fork函数

fork创建父子进程 ,父进程得到一个返回值,这个返回值为子进程的ID(一定大于零的整数),子进程同样得到一个返回值但为零。

父进程读取源文件写入管道

以及子进程读取管道,写入目标文件

  if(pid>0){                  //父进程while((nbyte = read(fdr,buf,N))>0)    //父进程读取文件写入管道write(fd[1],buf,nbyte);printf("读取成功\n");}if(pid==0)             //子进程{while((nbyte = read(fd[0],buf,N))>0)  //子进程从管道中读取,写入文件write(fdw,buf,nbyte);}

源码: 

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/fcntl.h>
#include<error.h>#define N 128
#define errlog(errmsg) do{perror(errmsg);\printf("--%s--%s--%d--\n",\__FILE__,__FUNCTION__,__LINE__);\return -1;}while(0)int main(int argc,char *argv[])
{pid_t pid;int fdr,fdw;ssize_t nbyte;int fd[2];char buf[N] = " ";if((fdr = open(argv[1],O_RDONLY))<0){errlog("open error");}if((fdw = open(argv[2],O_CREAT|O_WRONLY|O_TRUNC,0664))<0){errlog("open error");}if(pipe(fd)<0)       //创建管道{errlog("pipe error");}pid = fork();       //创建父子进程if(pid<0){errlog("fork error");}else if(pid>0){                  //父进程while((nbyte = read(fdr,buf,N))>0)    //父进程读取文件写入管道write(fd[1],buf,nbyte);printf("读取成功\n");}else if(pid==0)             //子进程{while((nbyte = read(fd[0],buf,N))>0)  //子进程从管道中读取,写入文件write(fdw,buf,nbyte);}return 0;
}

运行:

对.c文件编译

./编译生成.o文件 源文件 目标文件

cat 目标文件(查看复制后的结果)

执行成功

http://www.lryc.cn/news/234057.html

相关文章:

  • 【机器学习】 逻辑回归算法:原理、精确率、召回率、实例应用(癌症病例预测)
  • 算法萌新闯力扣:存在重复元素II
  • 《洛谷深入浅出基础篇》——P3405 citis and state ——哈希表
  • 在QGIS中加载显示3DTiles数据
  • HBase学习笔记(3)—— HBase整合Phoenix
  • CentOS 7上生成HTTPS证书
  • 解决React遍历每次渲染多个根元素导致无法为元素赋值key的问题
  • 2023年软件安装管家目录最新
  • mac苹果笔记本应用程序在哪?有什么快捷方式吗?
  • py 循环打开多个页面
  • AD教程 (十八)导入常见报错解决办法(unkonw pin及绿色报错等)
  • ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建
  • 【随手记】python语言的else语句在for、while等循环语句中的运用
  • RK3568 + YT 9215交换机芯片,MAC TO MAC 调试记录
  • Flutter笔记:桌面端应用多窗口管理方案
  • demo(三)eurekaribbonhystrix----服务降级熔断
  • 相机突然断电,保存的DAT视频文件如何修复
  • 【数据结构与算法篇】顺序栈的C++实现
  • 阿里云ESSD云盘、高效云盘和SSD云盘介绍和IOPS性能参数表
  • VSG-001
  • Smart Tomcat的使用
  • vue3 TS数据处理常见错误分析:列表变为对象的错误如何处理
  • Hive效率优化记录
  • ⑩③【MySQL】详解SQL优化
  • SQL 的 AND、OR 和 NOT 运算符:条件筛选的高级用法
  • 11.5MyBatis(进阶)
  • CentOS挂载:解锁文件系统的力量
  • 修身养性 - 阿纳托利: 健身指导
  • pip anaconda 设置 国内镜像源
  • 三江城115m²3室2厅2卫,现代简约不单是居所更是对生活的向往。福州中宅装饰,福州装修