14-1-进程间通信-pipe

news2024/11/26 12:24:12

一.无名管道pipe

特点:
(1)半双工(在同一时刻,数据传输的方向只能是接收或发送);
例如:对于主机和从机而言,在某一时刻,只能是主机发送(从机接收),或者主机接收(从机发送)
(2)只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系

1.pipe()函数原型
在这里插入图片描述返回值为int型,
参数为数组(有2个元素的数组),
成功返回0,失败返回-1,
注意pipefd[0]是读通道,
pipefd[1]是写通道
在这里插入图片描述

2.实验:使用pipe()创建两个管道,使用fork创建进程。e父进程向子进程写数据,子进程从父进程读数据。由于pipe是半双工的,所以父进程写数据的时候把都通道关闭,子进程读的时候把写通道关闭。

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{	int fd[2];
	int pid;
	char *writebuff = "12345\n";
	char readbuff[7];
	int ret_pipe;
	ret_pipe = pipe(fd);
	if(ret_pipe == 0)
	{
		pid = fork();
		if(pid < 0)
		{
			printf("child process creat failed\n");
		}
		else if(pid > 0)
		{
			printf("father process creat success\n");
			close(fd[0]);
			write(fd[1],writebuff,strlen(writebuff));
		}
		else
		{
			printf("child process creat success\n");
			close(fd[1]);
			read(fd[0],readbuff,strlen(readbuff));
			printf("readbuff:%s\n",readbuff);
		}

	}
	else
	{
		printf("creat pipe failed\n");
	}
	return 0;
}

在这里插入图片描述

3.前面的实验父子进程只能通过pipe进行1次通信,接下来将实现父子进程通过pipe持续通信。
pipe读写数据的注意点:““剪切”+“数据长度”+阻塞”
在这里插入图片描述
下面的代码是父子进程通过pipe实现持续通信

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/wait.h>
#include <sys/types.h>
int main()
{	int fd[2];
	int pid;
	//char *writebuff = "12345\n";
	char writebuff[50] = {0};
	char readbuff[50]={0};
	int ret_pipe;
	int parentflag=2;//1-父进程阻塞,2-父进程不阻塞
	int childflag=0;//1-子进程阻塞,2-子进程不阻塞
	ret_pipe = pipe(fd);
	if(ret_pipe == 0)
	{
		pid = fork();
		if(pid < 0)
		{
			printf("child process creat failed\n");
		}
		else if(pid > 0)
		{
			printf("father process creat success\n");
			while(1)
			{
				if(parentflag==1)//如果父进程被阻塞
				{
					printf("父进程被阻塞\n");
				}
				else if(parentflag==2)//父进程被解除阻塞
				{

					childflag=1;//父进程写入之前,子进程被阻塞
					
					scanf("%s",writebuff);
					close(fd[0]);
					write(fd[1],writebuff,strlen(writebuff)+1);
					//childflag=2;//父进程写入成功之后,子进程的阻塞状态被解除

				}
				else if(parentflag==0)//刚被初始化
				{
					printf("初始化,请父进程写入数据\n");
					parentflag==2;//解除父进程的阻塞状态;
				}

			}
					wait(NULL);//阻塞,直到子进程结束后才执行
					printf("father process exit\n");

		}
		else
		{
			printf("child process creat success\n");
			//利用阻塞,让父进程先进行数据的写入
			while(1)
			{
				 if(childflag==1)//如果子进程被阻塞
				{
					printf("子进程被阻塞\n");
					//父进程向pipe写入数据
					printf("请父进程向pipe写入数据\n");
					

					childflag=2;
					
				}
				else if(childflag==2)//子进程的阻塞被解除
				{
					parentflag=1;//子进程即将读取数据时,把父进程阻塞
					close(fd[1]);
					read(fd[0],readbuff,50);//程序会被阻塞在这里,直到管道中有数据
					printf("readbuff:%s\n",readbuff);
					parentflag=2;//子进程读取结束后,解除对父进程的阻塞
					printf("please input dtat\n");
				}
				else if(childflag==0)//初始化,主动阻塞子进程,让父进程先写入数据
				{
					childflag=1;
					printf("初始化,子进程被阻塞,请父进程写入数据\n");

				}
				

			}





		}

	}
	else
	{
		printf("creat pipe failed\n");
	}
	return 0;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/480086.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CentOS+nginx手动搭建WordPress

文章目录 前提条件php安装安装 EPEL 源及源管理工具&#xff1a;安装 REMI 源&#xff1a;安装 PHP7.3 及扩展&#xff1a;设置开机自动启动其他php命令 wordpress 安装下载WordPress将下载的WordPress移动至网站根目录修改WordPress配置文件配置nginx 创建完成后根据域名访问 …

分析linux中动态库so文件的常用方法

前言 在linux系统中&#xff0c;我们经常会遇到各种各样的动态库文件&#xff0c;常见的是.so后缀&#xff0c;那么我们应该如何分析这些文件的用途和作用呢&#xff1f;毕竟我们不能一知半解的“搞事情”。 正文 查看文件属性 首先&#xff0c;我们从整体上了解一下该文件的基…

maven-gpg-plugin gpg禁用交互式输入密码 免密码输入 设置默认密码 关闭pinentry-qt输入 passphrase

一、问题描述 在使用maven-gpg-plugin打包jar时,默认情况下&#xff0c;每次都会弹出对话框要你输入密码&#xff1a; 这就有点烦&#xff0c;有啥办法可以设置默认方法没&#xff1f;网上找了一圈&#xff0c;通过搜索关键词“passphrase”&#xff0c;找到了一些教程&#x…

无损以太网与网络拥塞管理(PFC、ECN)

无损以太网 无损以太网&#xff08;Lossless Ethernet&#xff09;是一种专门用于数据中心网络的网络技术&#xff0c;旨在提供低延迟、高吞吐量和可靠性的传输服务。它是在传统以太网的基础上进行了扩展&#xff0c;引入了新的拥塞管理机制&#xff0c;以避免数据包丢失和网络…

探索【Stable-Diffusion WEBUI】的插件:ControlNet 1.1

文章目录 &#xff08;零&#xff09;前言&#xff08;二&#xff09;ControlNet&#xff08;v1.1&#xff09;&#xff08;2.1&#xff09;模型&#xff08;2.2&#xff09;新版界面&#xff08;2.3&#xff09;预处理器 &#xff08;三&#xff09;偷懒 &#xff08;零&#…

机器学习与深度学习——通过决策树算法分类鸢尾花数据集iris求出错误率画出决策树并进行可视化

什么是决策树&#xff1f; 决策树是一种常用的机器学习算法&#xff0c;它可以对数据集进行分类或回归分析。决策树的结构类似于一棵树&#xff0c;由节点和边组成。每个节点代表一个特征或属性&#xff0c;每个边代表一个判断或决策。从根节点开始&#xff0c;根据特征的不同…

list的使用介绍---C++

一、list简介 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和后一个元素。…

计算机网络第一章(谢希仁第8版学习)

作者&#xff1a;爱塔居 专栏&#xff1a;计算机网络 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起加油 文章目录 目录 文章目录 一、网络、互连网、互联网&#xff08;因特网&#xff09;的概念 二、因特网的组成 三、交换方式 3.1 电路交换 3.2 分组交换 3.3 电路…

详解c++---list介绍

目录标题 list介绍list定义list遍历list数据插入push_backpush_frontinsert list删除pop_backpop_fronterase list排序list去重list合并list转移list其他函数emptysizefrontbackassignswapresizeclear list排序效率问题 list介绍 list是可以在常数范围内在任意位置进行插入和删…

【Java笔试强训 22】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;小易的升…

【Java笔试强训 21】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525; 洗牌 &…

免费搭建Plex家庭影音中心 - 打造超级多媒体中心【公网远程访问】

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

java+jsp企业物流货运快递管理系统servlet

功能需求具体描述&#xff1a; (1)用户功能模块包括用户登录注册&#xff0c;用户信息的修改&#xff0c;用户发布货物信息&#xff0c;给客服人员留言&#xff0c;对运输公司进行评价。 (2)企业功能模块包括企业注册登录&#xff0c;企业信息的修改&#xff0c;受理用户发布的…

c#笔记-代码格式

格式 为了让编译器能看懂。我们编写的源码必须符合一定的规范。 区分大小写 c#是大小写敏感语言。A1和a1是不同的东西。 不区分空白字符 c#对空白字符&#xff08;空格&#xff0c;制表符&#xff0c;换行&#xff09;不敏感。只要不截断单词&#xff0c;可以任意地使用空…

Java 基础进阶篇(二)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后&#xff1a;成员变量和方法的访问特点五、继承后&#xff1a;方法重写六、继承后&#xff1a;子类构造器的特点七、继承后&#xff1a;子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

TiDB实战篇-TiDB集群常用的监控指标

TiDB Server相关指标 Duration(延迟) 总体延迟 SQL不同的类型延迟 不同实例延迟 QPS&#xff08;每秒钟查询次数&#xff09; 总览 CPS&#xff08;一次请求多个sql,上面的QPS每一次就是一个记录&#xff09; 事务相关 延迟 影响性能的大事务 CPU 内存&#xff08;下图…

面试官:谈谈你对死锁的理解

1. 什么是死锁 比如上一次讲到 synchronized 的时候&#xff0c;一个线程&#xff0c;对同一个对象连续加锁两次&#xff0c;如果出现阻塞等待&#xff0c;代表这个锁是不可重入锁&#xff0c;这样的线程&#xff0c;也就称为死锁&#xff01; 一旦程序进入死锁了就会导致线程僵…

PromQL,让你轻松实现监控可视化!快来了解一下吧!

Prometheus 中的一些关键设计&#xff0c;比如注重标准和生态、监控目标动态发现机制、PromQL等。 PromQL 是 Prometheus 的查询语言&#xff0c;使用灵活方便&#xff0c;但很多人不知道如何更好利用它&#xff0c;发挥不出优势。 PromQL主要用于时序数据的查询和二次计算场…

【Docker】4、Docker 数据卷

目录 一、数据卷介绍二、数据卷相关命令三、创建一个数据卷&#xff0c;并查看数据卷在宿主机的目录位置四、数据卷挂载到容器五、数据卷挂载练习&#xff08;MySQL&#xff09;(1) 加载 MySQL 镜像(2) 根据镜像创建容器 一、数据卷介绍 &#x1f384; 数据卷&#xff08;volum…

Lychee图床 - 本地配置属于自己的相册管理系统并远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…