Linux——匿名管道

为什么要有进程间通信?

在操作系统中,进程是独立运行的程序,多个进程之间要想互相协作完成任务,就需要进程间通信。

什么是进程间通信?

  • 数据传输:一个进程需要将它的数据发送给另一个进程
  • 资源共享:多个进程间共享同样的资源
  • 通知事件:一个进程需要向另一个或一组进程发送消息,通知他们发送了某些事情,后者发送任务让他们执行
  • 进程控制:有些进程希望完全控制另一个进程的执行,此时进程希望能够拦截另一个进程的所有陷入和异常,并且能够及时通知它的状态改变。

进程间通信的目的

为了实现资源的共享,协作和同步,从而提高系统的效率和可靠性。

进程间通信的种类

1.管道

  • 匿名管道
  • 命名管道

2.System V

  • 消息队列
  • 共享内存
  • 信号量

3.POSIX V

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

管道的特点

  1. 管道是用来进行某种血缘关系的进程间通信的一种手段 ——一般用于父子进程
  2. 管道具有让进程间协同、提供了访问控制。(访问控制就是当一个文件里面没有数据的时候,另一方不会去读,只会阻塞等待。当文件满的时候,不能再写入了。)
  3. 管道提供了面向流式的通信服务——面向字节流
  4. 管道是基于文件的,声明周期随进程
  5. 管道是单向通信的。

如何看到同一份资源?

进程间通信的本质是实现资源的共享,那么最重要的一点就是如何看到同一份资源。
先聊一聊匿名管道,匿名管道是通过父子进程后,写时拷贝后,看到的同一份资源,然后让父进程关闭读端,子进程关闭写端,这样就可以让两个进程看到同一份资源了。
以前说过,每一个进程都有一个PCB,而每个PCB结构体中都有一个指针指向了struct file*struct,这个结构体里面就有文件描述符表,每一个文件描述表中的指针指向了每个文件。

在这里插入图片描述

所以父子进程通过fork后,就看到了同一份资源,如下图所示,又因为管道是单向的,关闭对应的读写端,就实现了通信。

在这里插入图片描述

匿名管道接口

  • pipe
    在这里插入图片描述

成功返回0,失败返回-1,错误码被设置。pipefd是输出型参数,期望调用它,可以得到被打开的文件的fd。

实验

#include <iostream>
#include <unistd.h>
#include <assert.h>
#include <sys/types.h>
#include <stdlib.h>
#include <cstring>
#include <wait.h>
using namespace std;char buffer[1024*8];int main()
{//创建管道int pipefd[2] = {0};int ret = pipe(pipefd);assert(ret != -1);(void)ret;pid_t id = fork();assert(id != -1);if(id == 0){//child//子进程去读,关闭写端close(pipefd[1]);// char buffer[1024*8];while(true){//s == 0 是读到了文件末尾// s > 0 说明在有数据,还在读取ssize_t s = read(pipefd[0],buffer,sizeof(buffer));if(s > 0){buffer[s] = 0;cout << "child get a message[" << getpid() << "] Father# " << buffer << endl;}else if(s == 0){cout << "write quit(father),me quit!" << endl;exit(2);}}}//father//关闭读端close(pipefd[0]);string message = "我是父进程,我正在给你发信息";int count = 0;// char send_buffer[1024*8];while(true){snprintf(buffer,sizeof(buffer),"%s[%d] : %d",message.c_str(),getpid(),count++);//向send_buffer中写入write(pipefd[1],buffer,strlen(buffer));sleep(1);//cout << count << endl;if(count == 5){cout << "writer quit(father)" << endl;break;}}close(pipefd[1]);pid_t n = waitpid(id,nullptr,0);cout << "id : " << id << " "<<  "n : " << n << endl;//这里pid结果一样,说明通信成功assert(n > 0);(void)n;return 0;
}

实验现象: 父进程向管道里面写入,子进程读,当5s后,关闭管道。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言数据结构之链表

目录 前言 \color{maroon}{前言} 前言1.链表的概念及结构2.链表的分类3.无头单向非循环链表的实现4.带头双向循环链表的实现5.顺序表和链表的对比 前言 \color{maroon}{前言} 前言 在上一篇博客中我们提到&#xff0c;线性表包括顺序表和链表&#xff0c;顺序表在上篇博客中已…

普通人切入抖音的黄金赛道 软件自动生成文字动画视频 3天15个作品涨粉5000

文字动画&#xff0c;就是导入一段文字&#xff0c;用软件可以自动生成一条文字动画视频&#xff0c;因为这是软件自动生成的&#xff0c;所以过原创的话是很简单没什么问题的。 这种视频的特点是什么? 首先第一点就是非常简单&#xff0c;找好素材直接导入软件就可以自动生成…

java-Spring-入门学习-第二天(单例模式和多例模式)

目录 Bean作用域 单例模式(默认可以不写) Spring下的 AutoWired 依赖注入 JaveEE下的 Resource 依赖注入 多例模式 Bean作用域 ​在Spring框架中&#xff0c;Bean是按照作用域来创建的&#xff0c;常见的作用域有两种&#xff1a;Singleton 和 Prototype。Singleton (单例…

STM32 HAL库F103系列之ADC实验(一)

ADC工作原理&#xff1a; 1、输入通道&#xff1a; 2、转换序列&#xff1a; A/D转换被组织为两组&#xff1a;规则组&#xff08;常规转换组&#xff09;和注入组&#xff08;注入转换组&#xff09; 规则组最多可以有16个转换&#xff0c;注入组最多有4个转换 规则组和注入…

【GIS面试】GIS算法介绍

作者&#xff1a;后端小肥肠 1. 前言 在地理信息系统&#xff08;GIS&#xff09;的领域中&#xff0c;算法扮演着极其重要的角色&#xff0c;它们使得复杂的空间数据分析成为可能。无论是在环境科学、城市规划&#xff0c;还是在灾害管理等众多领域&#xff0c;高效和精确的算…

【信号与系统 - 10】拉普拉斯变换

1 定义 周期信号的傅里叶变换那篇提到了&#xff1a; F ( j w ) ∫ − ∞ ∞ e − j w t f ( t ) d t F(jw)\int^{\infty}_{-\infty}e^{-jwt}f(t)dt F(jw)∫−∞∞​e−jwtf(t)dt 这个定义式需要满足绝对可积&#xff0c;即 ∫ − ∞ ∞ ∣ f ( t ) ∣ d t < ∞ \int…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一&#xff0c;队列的概念 队列是一种特殊的受限制的线性表。 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的t&#xff08;First In First Out&#xff09;的线性表&#xff0c;简称FIF…

这8款3DMAX建筑室内插件一个都不能少!

3DMax是一款经典的建筑室内场景设计和渲染软件&#xff0c;它能够帮助3D设计师、建筑师和艺术家实现他们的创意概念。本文推荐的8款建筑室内插件&#xff0c;将使3DMax如虎添翼&#xff0c;大大节约设计师们的工作时间&#xff0c;提高工作效率。 1.3DMAX楼层平面图生成器&…

idea使用plantuml插件报错(类图):Dot Executable: /opt/local/bin/dot

报错提示&#xff1a; 解决方式&#xff1a; 方式一: 直接设置Remote Rendering即可 &#xff08;使用服务器地址&#xff09; 无特殊要求可直接使用默认提供的服务地址&#xff0c;也可自行搭建服务替换地址。 自行搭建服务可参考&#xff1a; 在本地Windows 11 系统的桌面…

C++ 程序的内存分配

C 程序的内存分配 C 程序的内存分配栈堆数据区程序代码区参考 C 程序的内存分配 一个 C 编译的程序占用内存分为以下几个部分&#xff08;从高地址到低地址&#xff09;&#xff1a; 内核空间&#xff1a;由操作系统创建并控制&#xff0c;用户代码不能读写。栈&#xff1a;由…

【ds】替换空格

用‘%20’替换空格 var replaceBlank (charArr)> {if (!charArr || charArr.length 0) return var len charArr.lengthlet spaceLen 0for (let i 0; i < len; i) {if (charArr[i] ) {spaceLen}}var extraLen spaceLen * 2 // -> 20% 每一个空格需要增加2个ch…

Pytest精通指南(23)钩子函数-执行顺序(pytest-ordering)

文章目录 前言应用场景插件安装参数分析装饰方法装饰类装饰模块 前言 pytest-ordering 是一个pytest插件&#xff0c;它允许用户自定义测试用例的执行顺序。 默认情况下&#xff0c;pytest会按照模块、类、函数定义的顺序以及它们的名称的字母顺序来执行测试用例。 但通过使用 …