一、创建匿名管道:

#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()的使用(内附完整代码测试)相关推荐

  1. 10分钟搭建你的第一个图像识别模型 | 附完整代码

    (图片由AI科技大本营付费下载自视觉中国) 作者 | Pulkit Sharma 译者 | 王威力 来源 | 数据派THU(ID:DatapiTHU) [导读]本文介绍了图像识别的深度学习模型的建立过 ...

  2. linux学习---linux基于文件的IPC(匿名管道pipe,命名管道mkfifo,普通文件,socket文件)

    常用的IPC分为两个类别,一是基于文件,而是基于内存 基于文件的分别有匿名管道,有名管道,普通的文件共享,socket文件 基于内存的有普通内存共享(本文章没有介绍),共享内存,共享信号量,消息队列 ...

  3. 计算两时间段的重合天/小时/分钟/秒数(末尾附完整代码)

    说明: 有时候我们在计算时间时,有让获取两时间段重合的天数这种需求,小编也是遇到了这样的需求,就封装了一个工具类,希望能帮助到大家. 我们先进行分析 求两个时间段重合的天数,例如求(2022-05-0 ...

  4. 【Linux系统编程学习】匿名管道pipe与有名管道fifo

    此为牛客Linux C++和黑马Linux系统编程课程笔记. 0. 关于进程通信 Linux环境下,进程地址空间相互独立,每个进程各自有不同的用户地址空间.任何一个进程的全局变量在另一个进程中都看不到 ...

  5. 【编撰】linux IPC 002 - 匿名管道PIPE和有名管道FIFO的概念和实例,以及应用比较

    前言:上一节提到IPC的概述,本一节,原文作者比较详细的讨论了,管道的概念和实例和使用场景: 原文作者:郑彦兴 (mlinux@163.com)国防科大计算机学院 http://www.ibm.com ...

  6. 匿名管道(Pipe)和命名管道(FIFO)

    catalogue 1. pipe匿名管道 2. named pipe(FIFO)有名管道 1. pipe匿名管道 管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入 ...

  7. Linux中父子进程、兄弟子进程之间通信方式--匿名管道pipe(适用于有血缘关系的进程)

    文章目录 编程环境: 进程间通信 IPC: 匿名管道(pipe): 父子进程间通信: 兄弟子进程间通信: 管道的读写行为: 读操作: 写操作: 查看管道缓冲区大小: 设置管道的非阻塞属性: 下载地址: ...

  8. #Linux#进程间通信# 管道(pipe)-匿名管道pipe

    我们通常把一个进程连接到另一个进程的一个数据流称为一个"管道",通常是用作把一个进程的输出通过管道连接到另一个进程的输入.管道本质上是内核的一块缓存.内核使用环形队列机制,借助内核 ...

  9. 开放下载!《15分钟打造你自己的小程序》(内附详细代码)

    简介: 零基础开发你自己的支付宝小程序,教程在手不迷路,从入门到精通,还有详细代码在里面哦~ <15分钟打造你自己的小程序>独家电子书上线啦!零基础开发你自己的支付宝小程序,手把手教你从入 ...

  10. 用python爬小说_5分钟带你用Python爬完《剑来》小说(附完整代码)!

    Python资源共享群:484031800 思路: step 1 :请求<剑来>小说站点,获取两个东西小说名称--在Python程序同目录下,以小说名称创建文件夹 每章小说的链接地址 st ...

最新文章

  1. 研究生失联19天,父母焦急求助!最后竟然是在写博士研究计划......
  2. mysql bin.000047_解决mysql-bin.000001占用超大空间的问题
  3. 在不同浏览器上进行网页测试,结果是...... | 每日趣闻
  4. azure devops中文显示乱码_【Azure DevOps系列】Azure DevOps生成代码覆盖率
  5. EdoGantt甘特图中间件的事件对象
  6. python中列表用某个数字出现的次数_Python实现统计给定列表中指定数字出现次数的方法...
  7. aix升级新安装oracle,安装Oracle 11gR2 AIX 5.3 升级到TL11的一些小记录
  8. 解决Fast api打印两次日志的问题
  9. Linux入门之Linux与Windows常见对比
  10. 提高你的迅雷速度,绝对值得一看
  11. centos7 查看oracle运行日志_Linux(CentOS7)部署系列---常规应用部署方案
  12. C++ list容器
  13. Luogu4198 楼房重建
  14. 浅谈御剑web指纹识别-CMS指纹识别
  15. IIS建立FTP站点
  16. VS使用NPOI替换word模板中的关键字
  17. Powershell的字符串
  18. 新浪滚动新闻的json数据获取页面
  19. Postman请求报405错误
  20. c轴 t轴 l轴_数控加工中心3轴、3+2轴、5轴加工的区别是什么?

热门文章

  1. 全战三国战斗结束卡住_《全面战争:三国》新手指南!全系统解析+上手攻略(上)...
  2. Overlay network
  3. spring 中execution 表达式语法
  4. Azure安全系列(2)-体验Azure Security Center(安全中心)
  5. NET Framework安装不成功解决办法
  6. Matlab阶乘累加,MATLAB中带有符号变量的阶乘、累加函数的表达与求解
  7. 破解版 中易广告联盟程序 v6.0
  8. 吐血分享9个软件下载网站以及那些开发者大佬的传奇人生
  9. 《AutoCAD全套园林图纸绘制自学手册》一1.5 园林设计图的绘制
  10. 模拟信号的数字处理方法