05进程间通信-学习笔记

news2024/9/28 9:31:53

进程间通信(IPC)

概念

进程信技术简称IPC,可以利用此技木让多个进程相传建消数据,有大量的进程间通信方案

  • pipe 匿名管道
  • fifo 命名管简单理解,管道文件是一个指向内核管道缓冲区的指针,所有向管道文件读写的操作,都会重定向到内核管道中道
  • Posix 消息队列
  • System 消息队列
  • Signal 信号
  • Socket 套接字
  • MMAP 文件映射

进程有虚拟地址空间,进程间通信在虚拟地址的哪一层实现的?

绝大多数进程间通信是在内核层完成的, 因为内核层内存共享

pipe 匿名管道

为了便于开发者使用管道可以使用pipe函数创建管道,创建成功后会生成两个文件描述符,分别指向管道的读端fds[0]和写端fds[1]。匿名管道只能再有亲缘关系的进程之间使用

管道的原理

两个进程公用一个管道,实现通信

管道的特点
  1. 是一种传输介质,可以传输数据
  2. 管道传输具有方向性
  3. 管道具备存储能力,虽然不能持久存储,只能暂存
缺点

匿名管道只能在有亲缘关系的进程间的通信

使用管道

创建
pipe(int fds[2]);

注意:管道创建要在 创建子进程之前完成, 避免子进程创建管道


使用
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <pthread.h>
#include <signal.h>

#define MSG "HI"

int main()
{
    pid_t pid;
    int fds[2];

    pipe(fds);
    pid = fork();
    // 父进程写,子进程读
    if (pid > 0)
    {

        close(fds[0]); // 父进程关闭读功能,文件描述符-1
        printf("parent pid %d alive..\n", getpid());
        sleep(5);
        write(fds[1], MSG, strlen(MSG)); // 父进程写入信息
        printf("parent pid %d send msg success..\n", getpid());
        close(fds[1]); // 父进程使用完成写的功能,关闭写功能,文件描述符-1
    }
    else if (pid == 0)
    {
        close(fds[1]); // 子进程关闭写功能,文件描述符-1
        char buffer[1024];
        bzero(buffer, sizeof(buffer));
        read(fds[0], buffer, sizeof(buffer)); // 子进程读管道中的内容

        printf("child read msg %s \n", buffer);
        close(fds[0]); // 子进程使用完成读的功能,关闭写功能,文件描述符-
        exit(0);
    }
    else
    {
        perror("FORK CALL FAILED");
        exit(0);
    }
}

回收
  1. 每个指向管道的描述符都是一个引用计数,如果引用计数为0,系统自动释放管道空间,否则管道一直存在于内核层
  2. 管道使用时要确定通信方向,父写子读,子写父读,父子进程将不用的描述符关闭 关闭不用的
  3. pipe_fd使用完毕要close 引用计数-1 用完要关闭
  4. shutdown可以直接将引用计数清0

工作方式

单工 : 确定通信方向, 非读即写, 不可变更

半双工/可调节单工: 非读即写,但是不同时刻可以调节读写

双工:可以同时读写


匿名管道使用时的四种特殊情况

这四种情况具有普遍意义

  1. 管道的读写两端存在但是写端未向管道内写数据,读端读取完管道数据后如果管道为null,再次读阻塞
  2. 管道读写两端存在,但是读端未读取管道数据,写端写满管道后,再次写阻塞
  3. 管道写端关闭,读端读取管道剩余内容后,再次读读到0
  4. 管道读端关闭,写端向管道写数据,系统会发送SIGPIPE信号,杀死写端进程,读端关闭的情况下不允许写端访问管道

在一个C/S模型中,客户端发送了一条请求消息之后客户端异常关闭,服务端回复结果时异常关闭,服务端异常关闭原因?

(SIGPIPE信号)send(sockfd , buffer, size , MSG NOSIGNAL)

FIFO 命名管道

是一个内核缓冲区,为环形队列结构, 大小为4k,命名管道可以解决无关联进程间的通信

特点

管道通信与传统的文件传输不同,读取文件内容并不会除文件内容,但是管道是队列结构,出队的数据会从管道消失

可以持久化存储的磁盘文件并不适合作为传输介质

原理

简单理解,管道文件是一个指向内核管道缓冲区的指针,所有向管道文件读写的操作,都会重定向到内核管道中

使用

mkfifo pname #命令创建管道文件

mkfifo(char * pname,0664) #函数创建管道文件

管道文件的访问是要凑齐两种权限的 即使 RDWR,如果某个进程以一种权限打开管道文件, open函数会立即阻塞,等待另一种权限。即使只有一个进程 只要满足读写权限,就可以成功打开管道了

命名管道的两种特殊情况

一个读端中存在多个读序列,阻塞读只对第一个读序列有效,其他读序列被设置为非阻塞

1693832281723.png

管道的原子访问与非原子访问

1693832341789.png

判定是原子传输或是非原子,取决于用户发送数据包大小,如果数据包<=管道大小, 则是原子传输,如果数据包>管道大小(即4K) 就是非原子传输

非原子访问,最大化的利用容器空间, 只有容器满时才会限制写端,读写效率传输效率高,但是数据会被多次拆分,会对读端造成一些麻烦,读端要验证数据包完整性后才可以使用

mmap文件映射

功能

是一种内存映射文件的技术,它允许将文件映射到进程的虚拟内存空间,使得文件的内容可以像访问内存一样被读取和写入。

1、基本使用

头文件

#include <sys/mman.h>

函数原型、参数、返回值

void * ptr = mmap(NULL , size , PROT READIPROT WRITE , int how , int fd , 0);

参数

mmap%E5%8F%82%E6%95%B0.drawio.png

映射方式

共享映射 MAP_SHARED,共享映射有 Sync同步机制
私有映射 MAP_PRIVATE

原理

多进程间利用 MAP_SHARED的Sync同步机制可以实现共享映射实现进程通信

1688305464094.png

返回值

成功返回映射内存地址ptr
失败返回MAP_FAILED关键字

回收

munmap(ptr,size); //释放映射内存

使用细节

  1. 确定消息结构体大小
  2. 根据消息结构体大小,确定映射文件大小。大小为消息结构体的倍数
  3. 拓展空文件,使用截断方式,将映射文件拓展成一个指定的大小ftruncate(fd,sizeof(msg_t)*4096)
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <sys/mman.h>

int main()
{
    int fd;
    fd = open("map_file", O_RDWR);
    int size = lseek(fd, 0, SEEK_END);
    int *ptr = NULL;
    if ((ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
    {
        perror("mmap call failed");
        exit(0);
    }
    close(fd);
    sleep(10);
    ptr[0] = 0x34333231;
    munmap(ptr, size);
    return 0;
}

2、大数据文件处理,切割处理

1689385376866.png

最后一个参数,控制偏移量
映射偏移量必须是4k的整数倍,因为内存分页一页为4k。

1689385534267.png

3、零拷贝,减少拷贝开销

零拷贝并不是指完全节省拷贝或切换开销,而是尽可能较少

1689386098791.png

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

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

相关文章

Mybatis 拦截器实现单数据源内多数据库切换

大家好&#xff0c;我是 方圆。物流的分拣业务在某些分拣场地只有一个数据源&#xff0c;因为数据量比较大&#xff0c;将所有数据存在一张表内查询速度慢&#xff0c;也为了做不同设备数据的分库管理&#xff0c;便在这个数据源内创建了多个不同库名但表完全相同的数据库&…

阿昌教你如何使用通义灵码

阿昌教你如何使用通义灵码 Hi&#xff0c;我是阿昌&#xff0c;今天教你如何使用通义灵码。 一、通义灵码是什么 在使用前&#xff0c;肯定要知道通义灵码是个啥东西&#xff1b; 通义灵码&#xff0c;是阿里云出品的一款基于通义大模型的智能编码辅助工具&#xff0c;提供…

三大维度解码剑南春“高质量发展”丨年度盘点

执笔 | 洪大大 编辑 | 扬 灵 2023年即将画上句点&#xff0c;当我们回首这一年为行业带来惊喜的品牌&#xff0c;剑南春是其中之一。 回顾剑南春今年一整年的动作&#xff0c;从新品频发到双节&#xff08;618、双11&#xff09;热销&#xff0c;从全国巡展到荣誉满载&…

经纬恒润以太网网关,智能时代网络通关

汽车产业新四化步伐持续加速&#xff0c;智能网联逐渐成为整车标配&#xff0c;随着近年来相关政策频出以及对网联需求和功能的深度挖掘与发展&#xff0c;中国本土市场及本土供应商在这场新浪潮中逐渐走向C位。经纬恒润深耕智能网联领域多年&#xff0c;先后推出四代网关产品&…

UE Niagara - Bean 制作闪电

开启Beam的四个前提条件 Jitter Position可以使得Bean弯曲&#xff0c;但是是有曲线的弯曲&#xff0c;没有硬度 所以得调这个 把该值设置为1 Mode改为Custom

程序员月经焦虑 :如何成为高级工程师

高级工程师意味着什么&#xff1f; ChatGPT的回复&#xff1a;高级工程师对编程语言、软件设计原则和开发方法有深刻的理解。 开发方法 开发方法学是旨在使团队有效的组织方法。这些对我们来说可能很无聊&#xff0c;但我们希望你在这方面有专业知识。 我已经对非敏捷开发方法…

学生上课犯困怎么办

当你作为学生上课犯困时&#xff0c;首先不要过于自责或沮丧&#xff0c;因为这是很常见的情况。以下是一些建议&#xff0c;帮助你克服这个问题&#xff0c;保持专注并提高学习效率。 保持良好的作息习惯 睡眠对于大脑的健康和功能至关重要。确保每晚获得足够的睡眠&#xff…

《PySpark大数据分析实战》-07.Spark本地模式安装

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

C语言数据结构-----二叉树(2)堆的深入理解及应用、链式二叉树的讲解及代码实现

前言 本篇文章讲述的内容有部分是上一节写过的。重复内容不会再进行说明&#xff0c;大家可以看上一节内容 链接: C语言数据结构-----二叉树(1)认识数、二叉树、堆及堆的代码实现 文章目录 前言1.使用堆解决TOP-K问题2.向下调整堆的时间复杂度与向上调整堆的时间复杂度对比3.堆…

Android多进程和跨进程通讯方式

前言 我们经常开发过程中经常会听到线程和进程&#xff0c;在讲述Android进程多进程前我打算先简单梳理一下这俩者。 了解什么是进程与线程 进程&#xff1a; 系统中正在运行的一个应用程序&#xff0c;某个程序一旦运行就是一个进程&#xff0c;是资源分配的最小单位&#…

HarmonyOS--基础组件Text

Text组件 可以包含Span子组件。 接口 Text(content? : string | Resource) string: Text(我是ttttt) Resource: Text($r(app.string.aaaaaa)) 先找限定词目录&#xff0c;找不到内容 找base目录 属性 除支持通用属性外&#xff0c;还支持以下属性&#xff1a; 名称 参数…

玄关柜和鞋柜是一回事吗?福州中宅装饰,福州装修

玄关柜和鞋柜虽然都用于存放鞋子&#xff0c;但它们在概念上有所不同。玄关柜是一个更大的概念&#xff0c;它包括鞋柜和其他功能区域&#xff0c;可以说鞋柜是玄关柜的一部分。 1️⃣概念上的不同 玄关柜是一种集成了鞋柜、挂衣架、换鞋凳等多种功能于一体的家居家具&#xf…

大数据安全 | 【实验】Diffie-Hellman密钥交换算法

文章目录 &#x1f4da;关于DH密钥交换算法&#x1f4da;实验目的&#x1f4da;流程梳理&#x1f407;Step1&#xff1a;实现快速幂取模运算&#x1f407;Step2&#xff1a;根据算法原理分别定义公钥和共享密钥的计算&#x1f407;Step3&#xff1a;求解问题一&#x1f407;Ste…

LeetCode-2487. 从链表中移除节点【栈 递归 链表 单调栈】

LeetCode-2487. 从链表中移除节点【栈 递归 链表 单调栈】 题目描述&#xff1a;解题思路一&#xff1a;可以将链表转为数组&#xff0c;然后从后往前遍历&#xff0c;遇到大于等于当前元素的就入栈&#xff0c;最终栈里面的元素即是最终的答案。解题思路二&#xff1a;递归&am…

uniapp使用vue3的ref获取dom元素出现undefined

在我的代码里面&#xff0c;已经通过ref来定义想要获取的dom了&#xff0c;但是最后在页面渲染完之后&#xff0c;打印这个dom发现竟然是undefined&#xff1a; 获取不到dom元素&#xff1a; 最后查资料发现&#xff1a; 小程序中&#xff0c;uniapp的ref要绑定在子组件中才能…

【算法】【动规】乘积为正数的最长子数组长度

跳转汇总链接 &#x1f449;&#x1f517;算法题汇总链接 1.1 乘积为正数的最长子数组长度 &#x1f517;题目链接 给你一个整数数组 nums &#xff0c;请你求出乘积为正数的最长子数组的长度。 一个数组的子数组是由原数组中零个或者更多个连续数字组成的数组。 请你返回乘积…

基于ssm生活缴费系统及相关安全技术的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对生活缴费信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

AI会干掉美图秀秀们吗?

网上流传着这样一个传说&#xff0c;亚洲有三大“邪术”&#xff0c;韩国整容术、日本化妆术&#xff0c;还有震惊世界的中国PS 术。虽然是网友的戏称&#xff0c;但也反映了PS美图技术在国内盛行一时。 而说起美图技术就不得不提到美图公司&#xff0c;但美图公司近些年的日子…

陪玩系统圈子系统:打破孤单,寻找游戏共伴!APP小程序H5三端源码交付,支持二开!喜欢软件开发的朋友可以一起交流!

在如今快节奏的生活中&#xff0c;游戏作为一种娱乐方式&#xff0c;早已融入了人们的生活&#xff0c;成为许多人放松心情、释放压力的方式之一。然而&#xff0c;与此同时&#xff0c;游戏中的孤独感也成为一些玩家所面临的问题。为了解决这个问题&#xff0c;陪玩系统圈子系…

NorFlash 知识点总结

一、介绍 NorFlash&#xff08;也称为 NOR 型闪存&#xff09;是一种非易失性存储器&#xff0c;常用于嵌入式系统和存储设备中。NorFlash 是一种闪存类型&#xff0c;可以用于存储程序代码、固件、操作系统以及其他数据。与 NAND Flash 相比&#xff0c;NorFlash 具有较低的存…