目录

1.pipe函数

2.查看管道缓冲大小


1.pipe函数

#include <unistd.h>
int pipe(int pipefd[2]);功能:创建一个匿名管道,用来进程间通信参数:int pipefd[2],这是数组是一个传出参数pipefd[0] 对应的是管道的读端pipefd[1] 对应的是管道的写端返回值:成功:0失败:-1管道默认是阻塞的:如果管道中没有数据,read阻塞;如果管道满了,write阻塞注意:匿名进程只能用于具有血缘关系的进程之间的通信(父子进程、兄弟进程等)

程序示例1:子进程发送一次,父进程接收一次

#include <stdio.h>
#include <unistd.h>
#include <string.h>
//子进程发送数据给父进程,父进程读取到数据后输出
int main()
{//在fork之前创建管道int pipefd[2];int ret=pipe(pipefd);if(ret==-1){perror("pipe");return -1;}//创建子进程pid_t pid=fork();if(pid>0){//父进程 从管道的读取端读取数据char buf[1024]={0};int len=read(pipefd[0],buf,sizeof(buf));printf("parent recv :%s,pid=%d\n",buf,getpid());}else if(pid==0){//子进程 向管道的写入端写入数据//sleep(10);  //如果有这句话,子进程会休眠10秒再写入,父进程会一直等待直到子进程将数据写入再读取char *str="hello,I am the child";write(pipefd[1],str,strlen(str));}return 0;
}

程序示例2:子进程不断发送,父进程不断接收

#include <stdio.h>
#include <unistd.h>
#include <string.h>
//子进程发送数据给父进程,父进程读取到数据后输出
int main()
{//在fork之前创建管道int pipefd[2];int ret = pipe(pipefd);if (ret == -1){perror("pipe");return -1;}//创建子进程pid_t pid = fork();if (pid > 0){printf("parent process,pid=%d\n", getpid());//父进程 从管道的读取端读取数据char buf[1024] = {0};while (1){int len = read(pipefd[0], buf, sizeof(buf));printf("parent recv :%s,pid=%d\n", buf, getpid());}}else if (pid == 0){//子进程printf("child process,pid=%d\n", getpid());while (1){ //向管道的写入端写入数据char *str = "hello,I am the child";write(pipefd[1], str, strlen(str));sleep(1);}}return 0;
}

程序示例3:子进程不断发送数据,父进程接收该数据;父进程也不断发送数据,子进程接收该数据

#include <stdio.h>
#include <unistd.h>
#include <string.h>
//子进程发送数据给父进程,父进程读取到数据后输出
int main()
{//在fork之前创建管道int pipefd[2];int ret = pipe(pipefd);if (ret == -1){perror("pipe");return -1;}//创建子进程pid_t pid = fork();if (pid > 0){printf("parent process,pid=%d\n", getpid());//父进程 从管道的读取端读取数据char buf[1024] = {0};while (1){//读取数据int len = read(pipefd[0], buf, sizeof(buf));printf("parent recv :%s,pid=%d\n", buf, getpid());bzero(buf,1024);//写入数据char* str="hello,I am parent";write(pipefd[1],str,strlen(str));sleep(1);}}else if (pid == 0){//子进程printf("child process,pid=%d\n", getpid());char buf[1024]={0};while (1){ //向管道的写入端写入数据char *str = "hello,I am child";write(pipefd[1], str, strlen(str));sleep(1);//读取数据read(pipefd[0],buf,sizeof(buf));printf("child recv :%s,pid=%d\n", buf, getpid());bzero(buf,1024);}}return 0;
}//注:父进程和子进程的读写顺序要相反,不然两个都会阻塞,不能运行下去


2.查看管道缓冲大小

命令方式:

从下图可知,为4K

函数方式:

#include <stdio.h>
#include <unistd.h>
#include <string.h>int main()
{int pipefd[2];pipe(pipefd);//获取管道的大小long ret=fpathconf(pipefd[0],_PC_PIPE_BUF);printf("管道大小:%ld\n",ret);ret=fpathconf(pipefd[0],_PC_PIPE_BUF);printf("管道大小:%ld\n",ret);return 0;
}


参考:牛客网 C++高薪求职项目《Linux高并发服务器开发》2.12父子进程通过匿名管道通信

专属优惠链接:

https://www.nowcoder.com/courses/cover/live/504?coupon=AvTPnSG

2.12父子进程通过匿名管道通信相关推荐

  1. Linux编程:多个子进程与父进程使用匿名管道读写

    编写程序,在程序中父进程先后创建子进程1和子进程2.父子三个进程并发执行,并利用同一个匿名管道通信:两个子进程分别向管道写一则信息(内容自定,但要求包含子进程信息):父进程从管道读出信息并显示出来(要 ...

  2. CreatePipe匿名管道通信

    管道(Pipe)实际是用于进程间通信的一段共享内存,创建管道的进程称为管道服务器,连接到一个管道的进程为管道客户机.一个进程在向管道写入数据后,另一进程就可以从管道的另一端将其读取出来.匿名管道(An ...

  3. Linux C 进程间的管道通信

    1.进程间的通信方式 a.管道通信:无名管道.有名管道 b.信号通信:包括信号的发送.接收和处理 c.IPC(Inter-Process Communication):共享内存.消息队列.信号灯 ** ...

  4. Linux C 父子进程 与 有名管道

    1.mkfifo() 函数 创建管道文件的节点 2.open()函数 在内核创建管道空间,库<fcntl.h> read() write() 3.fork() 函数 父子进程,库<s ...

  5. linux进程管理 实现管道通信,Linux进程管理(二)管道通信 · lww’s Blog

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? 实验内容试验阻塞型读写过程中的各种情况 试验阻塞型读写过程中的各种情况 利用Posix信号量机制实现进程间对管道的互斥访 ...

  6. linux通过管道的进程通信,linux 线程或进程之间通过管道通信(pipe)

    线程间通信: #include // printf #include // exit #include // pipe #include // strlen #include // pthread_c ...

  7. C++学习:第六章Linux高级编程 - (七)信号、sigqueue、sigaction、IPC、管道、匿名管道

    回顾: 1. 信号的作用 2. 理解信号: 软中断 可靠与不可靠信号 kill -l 3. 信号发送与注册 kill/raise alarm setitimer signal 4. 信号的屏蔽 sig ...

  8. 8、进程通信-匿名管道

    匿名管道 一个单向,未命名的管道,通常用来在一个父进程和一个子进程间传输数据.只能实现本地机器上两个进程间的通信,而不能实现跨网络的通信. BOOL CreatePipe( PHANDLE hRead ...

  9. Linux——匿名管道、命名管道及进程池概念和实现原理

    目录 一.什么是匿名管道 二.如何使用匿名管道 (一).pipe原理 (二).pipe使用 三.命名管道概念及区别 (一).什么是命名管道 (二).与匿名管道的联系和区别 四.命名管道的使用 (一). ...

最新文章

  1. 在使用 interface 声明一个接口时,只可以使用那个修饰符修饰该接口?
  2. rtorrent - 强大的命令行BT客户端
  3. IntelliJ IDEA自动生成自定义的类注释和方法注释
  4. java 调用打印机 api_java 调用打印机API无法打印,但是直接打印可以,请问有人遇到过这样的问题吗?...
  5. ARM处理器异常处理
  6. 基于JAVA+SpringMVC+Mybatis+MYSQL的球鞋购物系统
  7. 我的2006年,我的博客站
  8. dwr(Direct Web Remoting)的使用
  9. 阿里云云计算 31在线实验--弹性伸缩(AS)初体验
  10. 彻底搞懂 Git 进阶用法
  11. 电脑插入耳机声音奇怪,模糊不清楚。解决方法
  12. 新浪微博架构和FEED架构分析--人人架构
  13. Vue中的 Filters 过滤器
  14. 弘辽科技:改淘宝宝贝副标题有影响吗?如何修改宝贝标题没影响?
  15. mac 批量文件编码格式转换
  16. v-for 循环中数据更新子组件视图不更新解决方案
  17. 华为发布FTTR全光家庭星光F30系列新品,点亮家庭数字生活
  18. 【前端调试技巧】webview,企业微信
  19. 电子书DIY——JBookMaker 1.06 使用手记
  20. react.js app_在React.JS中创建一个Weather App

热门文章

  1. 即将打破x86和ARM垄断地位的RISC-V,你了解吗?
  2. 最小二乘法直线拟合、圆拟合
  3. 安利三个好用视频配音乐的软件
  4. 检样用计算机时间,怎么检查电脑用了多久?
  5. Python参数化接口测试demo笔记
  6. 第三方支付频频被罚款,市场驱动下或是故意为之?
  7. 浏览器如何清除缓存教程
  8. Zookeeper的Centos集群搭建
  9. 枸杞动态分类-大致思路
  10. ufs2.2 协议扫盲(十一)