7分钟学会匿名管道pipe()的使用(内附完整代码测试)
一、创建匿名管道:
#include <unistd.h>
int pipe(int pipefd[2]);
作用:创建一个匿名管道,用来进程间通信;
参数:int pipefd[2]这个数组是一个传出参数;
pipefd[0] 对应管道的读端;
pipefd[1] 对应管道的写端;
返回值:
成功 0;
失败-1;
注意:匿名管道只能在具有公共祖先的进程(父与子进程、两个兄弟进程、亲戚之间)
二、查看管道缓冲大小的命令:ulimit -a
三、查看管道缓冲大小的函数:
#include <unistd.h>
long fpathconf(int fd,int name);
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{int pipefd[2];int ret=pipe(pipefd);long size=fpanthconf(pipefd[0],_PC_PIPE_BUF)//专门用来读取pipe的内存printf("pipe size:%ld",size);return 0;}
运行结果如下:
4096个字节=4K
四、其特点为:
1、管道是一个在内核内存中维护的缓冲器;
2、管道拥有文件的特质:读和写操作。匿名管道没有文件实体,而有名管道有文件实体;
3、通过管道传递的数据是有顺序的,读的顺序和写的顺序是一致的;
4、管道中的数据传递方向是单向的,一端用于写入,另一端用于读取,半双工(单工:只能单向传输,如遥控器向电视发送信号,但电视不能给遥控器发送信号;双工:双向都能同时传输信号,如两个在打电话,一个说话的时候也不影响对方说话,双方都能同时收到对方的信息;半双工:一段时间内只能一个方向传输,如果这个方向传输完毕另一端也会反向传输过来,如对讲机);
5、从管道读数据是一次性的,数据一旦被读走,数据将会被抛弃,释放空间以便储存新的数据;
6、匿名管道只能在具有公共祖先的进程(父与子进程、两个兄弟进程、亲戚之间)使用。
五、管道的数据结构:环形队列。
六、代码实现:
1、首先制作一个简易的单向传输发送信号
1 #include <unistd.h>2 #include <string.h>3 #include <sys/types.h>4 #include <sys/stat.h>5 #include <stdio.h>6 #include <stdlib.h>7 int main()8 {9 //在fork前创建管道10 int pipefd[2];//里边有0和111 int ret=pipe(pipefd);12 if(ret==-1)13 {14 perror("pipe:");15 exit(1);16 }17 pid_t pid=fork();18 if(pid>0)19 {20 //父进程21 printf("i am parent process,pid:%d\n",getpid());25 char buf[1024]={0};26 while(1)27 {28 int len=read(pipefd[0],buf,sizeof(buf));//读取子进程发来的数据29 printf("parent recv:%s,pid:%d\n",buf,getpid());34 }35 }else if(pid==0)36 { //子进程37 printf("i am child process,pid:%d\n",getpid());38 //向父进程发送数据39 char * str="hello,i am child";41 while(1)42 {43 write(pipefd[1],str,strlen(str));44 sleep(1);48 }49 }52 return 0;53 }
输出结果为:
2、制作一个双向传输的代码
在双向通信时一定要注意:子进程和父进程的读写顺序是不一样的,因为子进程要先向父进程发送数据后才能收到由父进程发来的数据,所以对子进程来说是先write(),再read()。而父进程是先接收数据,再给子进程发送数据,所以对父进程来说是先read(),再write(),否则会发生阻塞。
1 #include <unistd.h>2 #include <string.h>3 #include <sys/types.h>4 #include <sys/stat.h>5 #include <stdio.h>6 #include <stdlib.h>7 int main()8 {9 //在fork前创建管道10 int pipefd[2];//里边有0和111 int ret=pipe(pipefd);12 if(ret==-1)13 {14 perror("pipe:");15 exit(1);16 }17 pid_t pid=fork();18 if(pid>0)19 {20 //父进程21 printf("i am parent process,pid:%d\n",getpid());2223 char *strs="i am parent process!";25 char buf[1024]={0};26 while(1)27 {28 int len=read(pipefd[0],buf,sizeof(buf));//读取来自子进程发来的数据29 printf("parent recv:%s,pid:%d\n",buf,getpid());30 //向子进程发送数据31 write(pipefd[1],strs,strlen(strs));32 sleep(1);34 }35 }else if(pid==0)36 { //子进程37 printf("i am child process,pid:%d\n",getpid());39 char * str="hello,i am child";40 char buff[1024]={0};41 while(1)42 {38 //向父进程发送数据43 write(pipefd[1],str,strlen(str));44 sleep(1);45 //读取父进程发送来的数据46 int fd=read(pipefd[0],buff,sizeof(buff));47 printf("child recv:%s,pid:%d\n",buff,getpid());48 }49 }52 return 0;53 }
运行结果如下:
觉得好看就给个赞吧,笔芯。
7分钟学会匿名管道pipe()的使用(内附完整代码测试)相关推荐
- 10分钟搭建你的第一个图像识别模型 | 附完整代码
(图片由AI科技大本营付费下载自视觉中国) 作者 | Pulkit Sharma 译者 | 王威力 来源 | 数据派THU(ID:DatapiTHU) [导读]本文介绍了图像识别的深度学习模型的建立过 ...
- linux学习---linux基于文件的IPC(匿名管道pipe,命名管道mkfifo,普通文件,socket文件)
常用的IPC分为两个类别,一是基于文件,而是基于内存 基于文件的分别有匿名管道,有名管道,普通的文件共享,socket文件 基于内存的有普通内存共享(本文章没有介绍),共享内存,共享信号量,消息队列 ...
- 计算两时间段的重合天/小时/分钟/秒数(末尾附完整代码)
说明: 有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家. 我们先进行分析 求两个时间段重合的天数,例如求(2022-05-0 ...
- 【Linux系统编程学习】匿名管道pipe与有名管道fifo
此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...
- 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较
前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...
- 匿名管道(Pipe)和命名管道(FIFO)
catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...
- Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)
文章目录 编程环境: 进程间通信 IPC: 匿名管道(pipe): 父子进程间通信: 兄弟子进程间通信: 管道的读写行为: 读操作: 写操作: 查看管道缓冲区大小: 设置管道的非阻塞属性: 下载地址: ...
- #Linux#进程间通信# 管道(pipe)-匿名管道pipe
我们通常把一个进程连接到另一个进程的一个数据流称为一个"管道",通常是用作把一个进程的输出通过管道连接到另一个进程的输入.管道本质上是内核的一块缓存.内核使用环形队列机制,借助内核 ...
- 开放下载!《15分钟打造你自己的小程序》(内附详细代码)
简介: 零基础开发你自己的支付宝小程序,教程在手不迷路,从入门到精通,还有详细代码在里面哦~ <15分钟打造你自己的小程序>独家电子书上线啦!零基础开发你自己的支付宝小程序,手把手教你从入 ...
- 用python爬小说_5分钟带你用Python爬完《剑来》小说(附完整代码)!
Python资源共享群:484031800 思路: step 1 :请求<剑来>小说站点,获取两个东西小说名称--在Python程序同目录下,以小说名称创建文件夹 每章小说的链接地址 st ...
最新文章
- 研究生失联19天,父母焦急求助!最后竟然是在写博士研究计划......
- mysql bin.000047_解决mysql-bin.000001占用超大空间的问题
- 在不同浏览器上进行网页测试,结果是...... | 每日趣闻
- azure devops中文显示乱码_【Azure DevOps系列】Azure DevOps生成代码覆盖率
- EdoGantt甘特图中间件的事件对象
- python中列表用某个数字出现的次数_Python实现统计给定列表中指定数字出现次数的方法...
- aix升级新安装oracle,安装Oracle 11gR2 AIX 5.3 升级到TL11的一些小记录
- 解决Fast api打印两次日志的问题
- Linux入门之Linux与Windows常见对比
- 提高你的迅雷速度,绝对值得一看
- centos7 查看oracle运行日志_Linux(CentOS7)部署系列---常规应用部署方案
- C++ list容器
- Luogu4198 楼房重建
- 浅谈御剑web指纹识别-CMS指纹识别
- IIS建立FTP站点
- VS使用NPOI替换word模板中的关键字
- Powershell的字符串
- 新浪滚动新闻的json数据获取页面
- Postman请求报405错误
- c轴 t轴 l轴_数控加工中心3轴、3+2轴、5轴加工的区别是什么?
热门文章
- 全战三国战斗结束卡住_《全面战争:三国》新手指南!全系统解析+上手攻略(上)...
- Overlay network
- spring 中execution 表达式语法
- Azure安全系列(2)-体验Azure Security Center(安全中心)
- NET Framework安装不成功解决办法
- Matlab阶乘累加,MATLAB中带有符号变量的阶乘、累加函数的表达与求解
- 破解版 中易广告联盟程序 v6.0
- 吐血分享9个软件下载网站以及那些开发者大佬的传奇人生
- 《AutoCAD全套园林图纸绘制自学手册》一1.5 园林设计图的绘制
- 模拟信号的数字处理方法