<Linux>system v通信

news2024/9/29 9:33:42

前言😃😃😃

进程间通信的方式

  1. 管道 - Linux原生提供

  1. SystemV - 多线程单机通信

  1. posix - 多线程网络通信

这里我们主要是介绍一下SystemV通信方式

一、SystemV原理

首先我们需要知道通信的本质:多个进程能看到同一个资源,即内存。管道是这样的,SystemV同样也是这样的,两者的区别:

管道:通过创建管道文件,让两个进程访问,来实现共享内存,这是一个巧合的方式,刚好文件的特性可以允许支持进程间通信。

SystemV:是由操作系统的设计者,专门为了进程通信设计的系统接口。

SystemV原理介绍

首先我们梳理一遍进程的创建,当我们创建进程A时,操作系统对进程遵循的是先描述在组织的管理方式,要描述就需要创建特定的数据结构来进行存储相应的描述数据,所以操作系统会为A创建对应的数据结构,这其中会创建一个task_struct结构体来记录这个进程的相关数据,同时操作系统会对每一个进程创建一个进程地址空间mm_struct,而task_struct里面有一个指针来指向这个进程地址空间,不清楚进程地址空间的,可以先将它想象成操作系统为这个进程画的大饼,告诉这个进程:你可以使用很多的内存,即虚假的内存。为了和实际的物理内存进行映射,操作系统还会创建一个页表,来进行进程地址空间和物理内存的映射。想要详细了解进程地址空间的可空降(67条消息) <Linux>进程地址空间_绅士·永的博客-CSDN博客

进程地址空间中由上自下依次是->栈区 共享内存 堆区 静态区 全局区 代码区 ,这里我们可以特别注意一下共享内存。

通过以上的认知我们可以说一下原理了,SystmV就是在物理内存中申请一片共享内存。打开文件其实也就是将文件加载在物理内存中。我们得到这个共享内存,在将这个共享内存和我们需要进行通信的进程建立起一种联系,即可通过创建的共享内存进行通信了;

提高:

申请这个共享内存的时候,由我们提供的参数,通过内部的算法会计算出一个唯一的key,进程在进行连接的时候,通过这个唯一的key值,即可找到对应的唯一的共享内存。

至于为什么key是唯一的?OS为了确保key的唯一性,会在内核中创建一个表,记录每一个key值,保证key的唯一性。

二、demo代码

#pragma once 

#include <iostream>
#include <cassert>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>

#define PATH    "/home/mr"
#define PROJ_ID 066
#define SIZE    4096
#include "comm.hpp"
#include "log.hpp"

int main()
{
    //获取项目key值
    key_t key = ftok(PATH, PROJ_ID);//传入路径,和id,返回一个唯一的key
    if (key == -1)
    {
        perror("ftok");
    }

    log("get a only of key:") << key << std::endl;    
    sleep(5);

    //创建共享内存
    int shmid = shmget(key, SIZE, IPC_CREAT | IPC_EXCL | 0666);//创建共享内存
    if (shmid == -1)
    {
        perror("shmget");
    }

    log("creat a shm id is:") << shmid << std::endl;
    sleep(5);

    //挂接到共享内存
    char* shmaddr = (char*)shmat(shmid, nullptr, 0);
    assert(shmaddr != (void*)-1);

    log("link this porcess:") << shmaddr << std::endl;
    sleep(5);

    //通信处理

    //断开挂接
    int n = shmdt(shmaddr);
    assert(n != -1);
    (void)n;

    log("Off this porcess:") << n << std::endl;
    sleep(5);

    //删除共享内存
    int s = shmctl(shmid, IPC_RMID, 0);
    assert(s != -1);
    (void)s;

    log("delete this shm:") << s << std::endl;
    sleep(5);

    return 0;
}
#include "comm.hpp"

int main()
{
    // 获取项目key值
    key_t key = ftok(PATH, PROJ_ID);
    if (key == -1)
    {
        perror("ftok");
    }

    // 获取共享内存
    int shmid = shmget(key, SIZE, 0);
    if (shmid == -1)
    {
        perror("shmget");
    }

    //挂接
    char* shmaddr = (char*)shmat(shmid, nullptr, 0);

    sleep(5);

     //断开挂接
    int n = shmdt(shmaddr);
    assert(n != -1);
    (void)n;

    return 0;
}
#ifndef _LOG_HPP
#define _LOG_HPP

#include <iostream>
#include <string>
#include <ctime>

std::ostream &log(std::string message)
{
    std::cout << (unsigned int)time(nullptr) << ":" << message;
    return std::cout;
}

#endif
.PHONY:all
all:shmServe shmclint

shmServe:shmServe.cc
    g++ -o $@ $^ -std=c++11
shmclint:shmclint.cc
    g++ -o $@ $^ -std=c++11

.PHONY:clean
clean:
    rm -f shmclint shmServe

三、总结

  1. 共享内存是由操作系统提供的

  1. shmget():创建共享内存

  1. ftok():得到一个随机key值

  1. shmat:挂接进程

  1. shmdt:断开挂接

  1. shmctl:删除共享内存

注意:共享内存是不会自动删除的,需要我们手动删除或者代码删除,手动命令行可以通过ipcrm -m id 删除,ipcs -m查看当前系统的共享内存。

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

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

相关文章

如何使用码匠连接 CouchDB

目录 在码匠中集成 CouchDB 在码匠中使用 CouchDB 关于码匠 CouchDB 是一种开源的 NoSQL 数据库服务&#xff0c;它使用基于文档的数据模型来存储数据。CouchDB 的数据源提供了高度可扩展性、高可用性和分布式性质。它支持跨多个节点的数据同步和复制&#xff0c;可以在多个…

mysql数据库之表级锁

表级锁&#xff0c;每次操作锁住整张表。锁定粒度大&#xff0c;发生所冲突的概率最高&#xff0c;并发度最低。应用在myisam、innodb、bdb等存储引擎中。 一、表级锁分类。 1、表锁 2、元数据锁&#xff08;meta data lock&#xff0c;MDL&#xff09; 3、意向锁 二、表锁…

yum保留安装包

一. 用downloadonly下载 1.1 处理依赖关系自动下载到/tmp/pages目录&#xff0c;pages这个目录会自动创建 yum install --downloadonly --downloaddir/tmp/pages ceph-deploy注意&#xff0c;如果下载的包包含了任何没有满足的依赖关系&#xff0c;yum将会把所有的依赖关系包下…

微信小程序的代码由哪些结构组成?

小程序官方建议把所有小程序的页面&#xff0c;都存放在pages 目录中&#xff0c;以单独的文件夹存在&#xff0c;如图所示&#xff1a; 其中&#xff0c;每个页面由4 个基本文件组成&#xff0c;它们分别是&#xff1a;js文件(页面的脚本文件&#xff0c;存放页面的数据、事件…

Bean三种实例化方式的底层原理

Bean实例化的三种方式 1&#xff0c;使用类构造器实例化&#xff08;无参构造函数&#xff09;2&#xff0c;使用静态工厂方法实例化&#xff08;简单工厂模式&#xff09;3&#xff0c;使用实例工厂方法实例化&#xff08;工厂方法模式&#xff09; 基于以上的三种方式&…

时间轮来优化定时器

在raft协议中&#xff0c; 会初始化三个计时器是和选举有关的&#xff1a; voteTimer&#xff1a;这个timer负责定期的检查&#xff0c;如果当前的state的状态是候选者&#xff08;STATE_CANDIDATE&#xff09;&#xff0c;那么就会发起选举 electionTimer&#xff1a;在一定时…

Photoshop如何安装ZXP扩展插件?

Photoshop如何安装ZXP扩展插件呢&#xff1f;有一些小伙伴不会安装&#xff0c;今天介绍两种安装ZXP扩展的方法&#xff0c;希望对能帮助到大家。方法一&#xff1a;手动安装方式1&#xff09;把下载好的.zxp扩展名改为.zip&#xff0c;然后解压。Windows系统&#xff1a;C:\Us…

参考文献去哪里查找,参考文献标准格式是什么

1、参考文献类型&#xff1a; 普通图书[M]、期刊文章[J]、报纸文章[N]、论文集[C]、学位论 文[D]、报告[R]、标准[s]、专利[P]、数据库[DB]、计算机程序[CP]、电 子公告[EB]、联机网络[OL]、网上期刊[J&#xff0f;OL]、网上电子公告[EB&#xff0f;OL]、其他未 说明文献[z]。…

I.MX6ULL_Linux_驱动篇(28) 字符设备驱动

字符设备驱动简介 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c;按照字节流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。比如我们最常见的点灯、按键、 IIC、 SPI&#xff0c;LCD 等等都是字符设备&#xff0c;这…

蓝牙耳机品牌哪个质量好?2023质量好的蓝牙耳机推荐

相较于有线耳机&#xff0c;蓝牙耳机凭借更方便地使用而受到不少人的喜爱&#xff0c;蓝牙耳机各种性能的发展也越来越先进。哪个品牌的蓝牙耳机质量好&#xff1f;针对这个问题&#xff0c;我来给大家推荐几款质量好的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳…

接口请求参数异常之@RequestParam

问题 具体问题如下&#xff1a; 正确的如下&#xff1a; 如上两图所示&#xff1a;我们的请求参数是pageNo和pageSize&#xff0c;但是却没有正确显示&#xff0c;则说明我们的接口存在了问题。 分析问题 参数为什么没有正确的显示每页显示条数和当前页数&#xff0c;而是我…

jmeter-定时器

记录下业务中常用的定时器概念以及使用流程&#xff0c;仅供自己学习。 定时器的作用域 1、定时器是在每个sampler&#xff08;采样器&#xff09;之前执行的&#xff0c;而不是之后&#xff08;无论定时器位置在sampler之前还是下面&#xff09;&#xff1b; 2、当执行一个sa…

Apache HTTP Server <2.4.56 mod_proxy 模块存在请求走私漏洞(CVE-2023-25690)

漏洞描述 Apache HTTP Server是一款Web服务器。 该项目受影响版本存在请求走私漏洞。由于intro.xml中存在RewriteRule配置不当&#xff0c;当Apache启用mod_proxy且配置如 RewriteRule “^/here/(.*)” " http://example.com:8080/elsewhere?$1"; http://example.…

Elasticsearch 核心技术(七):IK 中文分词器的安装、使用、自定义字典

❤️ 博客主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录一、安装 IK 分词器方式一&#xff1a;自行下载并解压安装包方式二&#xff1a;…

【前端学习】D3:CSS进阶

文章目录前言系列文章目录1 CSS的三大特性1.1 层叠性1.2 继承性1.3 优先级&#xff08;*&#xff09;2 盒子模型2.1 看透网页布局的本质2.2 盒子模型&#xff08;Box Model&#xff09;的组成2.3 边框&#xff08;border&#xff09;2.3.1 普通边框2.3.2 表格的细线边框2.3.3 边…

【Hello Linux】命令行解释器

作者&#xff1a;小萌新 专栏&#xff1a;Linux 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;使用进程的基础知识和进程控制知识做出一个简单的shell程序 命令行解释器介绍搭架子缓冲区获取命令如何从标准输入中获取字符串解析命令…

Python3 爬虫实战教程 ,网页审查元素【Python学习连续,请关注】

在讲解爬虫内容之前&#xff0c;我们需要先学习一项写爬虫的必备技能&#xff1a;审查元素&#xff08;如果已掌握&#xff0c;可跳过此部分内容&#xff09;。1、审查元素在浏览器的地址栏输入URL地址&#xff0c;在网页处右键单击&#xff0c;找到检查。(不同浏览器的叫法不同…

爬虫(三)selenium

文章目录1. Selenium 安装2. Selenium 基本功能2.1 初始化浏览器2.2 其他功能3. 查找元素3.1 八大定位方法3.2 查找相对元素3.3 键盘事件4. 元素方法5. JS执行运行环境&#xff1a; selenium4.7.2 1. Selenium 安装 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接…

成都欢蓬电商:抖音带话题春日好物节活动规则

抖音带话题“春日好物节”&#xff0c;投稿瓜分优质内容激励&#xff0c;快来投稿参与本次抖音活动&#xff01; 一、活动玩法 活动时间&#xff1a;3月3日-3月16日 活动形式&#xff1a; 玩法说明&#xff1a; 若同一id同时参加获奖&#xff0c;则不重复激励; 因视频投流涉…

易基因:RRBS揭示晚年锻炼可以减缓骨骼肌表观遗传衰老(甲基化年龄)|新研究

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2021年12月21日&#xff0c;美国阿肯色大学、德克萨斯大学和肯塔基大学的研究人员合作在《Aging Cell》杂志发表了题为“Late-life exercise mitigates skeletal muscle epigenetic aging”…