Linux 系统下的进程间通信 IPC 入门 「下」

news2024/10/7 8:24:33

以下内容为本人的学习笔记,如需要转载,请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/IvPHnEsC6ZdIHaFL8Deazg

共享内存

我们在进程间传输比较大的数据块时,通常选用共享内存的方式。共享内存大小也是有限制的,系统范围内能申请到的最大共享内存数量是 4096 个,每个最大空间为 18014398509465599 kbytes,所有共享内存最多占用空间为 18014398509481980 kbytes,当然每个共享内存最小限制为 1 字节。

如果需要查看修改限制值,可以按顺序分别参考下面的几个内核文件:

/proc/sys/kernel/shmmni
/proc/sys/kernel/shmmax
/proc/sys/kernel/shmall

通过 shmget() 申请共享内存资源,参数 key 指定 IPC key,size 是分配的共享内存大小(创建时有效,必须为 PAGE_SIZE 的倍数大小),参数 shmflg 指定标志类似消息队列和信号量。

int shmid = shmget(key, PAGE_SIZE, IPC_CREAT | 0666);
if (shmid == -1) {
    printf("shmget %s", strerror(errno));
}

一般 PAGE_SIZE 默认 4096,如果你需要查看当前系统下的配置值,可以:

$ pagesize

通过共享内存传输数据,其实就是在进程同步的情况下读写指定的内存空间,一般的进程同步采用信号量。读写前,被指定的进程内存空间必须先和共享内存绑定,绑定通过函数 shmat(),解绑通过函数 shmdt()。

#include <sys/shm.h>
void *shmat(int shmid, const void *_Nullable shmaddr, int shmflg);
int shmdt(const void *shmaddr);

绑定和解绑无须在每次发送接收共享内存的数据时都执行,如果是用户自己分配内存空间再绑定会增加内存泄漏的安全风险。

所以最佳实践是,在发送最开始时向系统申请自动绑定并返回被绑定的进程内部地址空间即可,接收同理,但是接收端在进程退出前应该负责解绑操作。

如何向系统申请自动绑定?在调用 shmat() 时,参数 shmaddr 用于指定被绑定的进程内部地址空间的地址,设为 NULL 即可。

发送数据

static char *pshm = NULL;
if (!pshm) {
    ...

    // 向系统申请自动绑定进程内部地址空间
    // 并保存返回的地址
    pshm = (char*)shmat(shmid, 0, 0);
    if ((char*)-1 == pshm) {
        printf("shmat %s", strerror(errno));
        return; // 退出
    }
}

... // 请求信号量

// 将长度为 len 的数据 data 写入被绑定的进程内部地址空间
memcpy(pshm, data, len);

... // 释放信号量

上面这段代码通常会封装成一个发送函数,pshm 被声明为 static 的变量就为了不用每次进入函数都重新绑定进程内部地址空间。实际写入数据时,需要利用信号量同步。

接收数据

接收数据不需要手动调用接收函数,一般通过创建子线程,在子线程内部循环地读取被绑定的进程内部地址空间的数据即可,当然,读取同样需要利用信号量同步。

char *data = NULL;
...

// 向系统申请自动绑定进程内部地址空间
// 并保存返回的地址
data = (uint8_t*)shmat(shmid, 0, 0);
if ((uint8_t*)-1 == data) {
    printf("shmat %s", strerror(errno));
    return; // 退出
}

while (1) {
    ... // 请求信号量

    // 将被绑定的进程内部地址空间 data 的数据
    // 另存到大小为 size 的缓冲区 buf
    memcpy(buf, data, size);

    ... // 释放信号量
}

// 退出前解绑
int ret = shmdt(data);
if (-1 == ret) {
    printf("shmdt %s", strerror(errno));
}

查看当前 IPC 状态

Linux 系统提供了 ipcs 指令用于查看 IPC 资源的状态信息

$ ipcs -a

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x0f050002 0          user         666        0            0           
0x0e050002 1          user         666        0            0           

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      
0x00000000 131072     user         600        40960      2          dest         
0x00000000 131074     user         600        40960      2          dest         
0x00000000 131075     user         600        16384      2          dest         
...        

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x09050002 0          user         666        2         
0x0c050002 1          user         666        2

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

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

相关文章

python-django企业设备配件检修系统flask+vue

本课题使用Python语言进行开发。代码层面的操作主要在PyCharm中进行&#xff0c;将系统所使用到的表以及数据存储到MySQL数据库中&#xff0c;方便对数据进行操作本课题基于WEB的开发平台&#xff0c;设计的基本思路是&#xff1a; 前端&#xff1a;vue.jselementui 框架&#…

OpenCV杂记(2):图像拼接(hconcat, vconcat)

OpenCV杂记&#xff08;1&#xff09;&#xff1a;绘制OSD&#xff08;cv::getTextSize, cv::putText&#xff09;https://blog.csdn.net/tecsai/article/details/137872058 1. 简述 做图像处理或计算机视觉技术的同学都知道&#xff0c;我们在工作中会经常遇到需要将两幅图像拼…

李沐51_序列数据——自学笔记

1.时序模型中&#xff0c;当前数据跟之前观察到的数据相关 2.自回归模型使用自身过去数据来预测未来 3马尔可夫模型假设当前只跟最近少数数据相关&#xff0c;从而简化模型 4.潜变量模型使用潜变量来概括历史信息 生成一些数据&#xff1a;使用正弦函数和一些可加性噪声来生…

Qt/QML编程之路:carplay认证(52)

现在有些中控采用高通的芯片如8155、8295等,实现多屏互动等,但是也有一些车型走低成本方案,比如能够实现HiCar、CarLife或者苹果Apple的Carplay等能进行手机投屏就好了。 能实现CarPlay功能通过Carplay认证,也就成了一些必须的过程,国产车规级中控芯片里,开阳有一款ARK1…

Android开发——ViewPager

适配器 package com.example.myapplication; import android.view.View; import android.view.ViewGroup; import androidx.annotation.AnimatorRes; import androidx.annotation.NonNull; import androidx.viewpager.widget.PagerAdapter; import java.util.ArrayList; publi…

单链表逆置(头插法,递归,数据结构栈的应用)

链表逆置就是把最后一个数据提到最前面&#xff0c;倒数第二个放到第二个……依次类推&#xff0c;直到第一个到最后一个。 由于链表没有下标&#xff0c;所以不能借助下标来实行数据的逆置&#xff0c;要靠空间的转移来完成链表的逆置&#xff0c;这里采用没有头节点的链表来实…

SSM项目前后端分离详细说明

1.后端 1.1打包 说明&#xff1a;使用idea打开项目&#xff0c;然后进行打包。 1.2tomcat 说明&#xff1a;把后端打成war包后放入tomcat启动。 1.3启动tomcat 说明&#xff1a; 找到tomcat中bin目录中的startup.bat文件&#xff0c;进行启动。如果启动失败&#xff0c;可以…

【英文演讲】人工智能,Artificial Intelligence: A Glimpse into the Future World

文章目录 1、Power Point(演示文稿)2、Speech manuscript(演讲稿)【假】序言:在这个充满机遇与挑战的时代,人工智能正以惊人的速度改变着我们的生活与工作方式。它不仅是一种技术,更是一种全新的思维方式,引领着我们走向未来世界的新篇章。本次演讲将深入探讨人工智能对…

wechat机器人个性化维护部署修改

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 服务端部署配置 在新服务器上安装mysql8.0 ,redis ,nginx,emqx修改数据库的远程访问权限&#xff0c;导入数据库文件application.yml中修改redis的信息application-druild.yml中修改数据…

一文详解视觉Transformer模型压缩和加速策略(量化/低秩近似/蒸馏/剪枝)

视觉Transformer&#xff08;ViT&#xff09;在计算机视觉领域标志性地实现了一次革命&#xff0c;超越了各种任务的最先进模型。然而&#xff0c;它们的实际应用受到高计算和内存需求的限制。本研究通过评估四种主要的模型压缩技术&#xff1a;量化、低秩近似、知识蒸馏和剪枝…

【基础】gcc-动态库和静态库的创建和使用-命令

目录 1 动态库的建立使用2 动态库封装过程2.1 编译动态库2.2 使用动态库2.3 命令参数说明 3 静态库封装过程3.1 静态库的封装3.2 静态库的使用 1 动态库的建立使用 首先建立一个头文件&#xff0c;和三个.cpp文件&#xff0c;目的是要把这些文件链接成动态库&#xff1a; 其中…

C++数组的创建、初始化、传参

C数组创建 静态数组&#xff1a;填入具体的大小 type arrayName [arraySize];动态数组&#xff1a;在运行时分配内存。 int* arrnew int[5]; //当程序使用完new分配的内存时&#xff0c;应使用delete释放他们 delete []arr;用标准库容器&#xff1a;std::vector 可以动态增长…

Python 异常处理深度解析:掌握健壮代码的关键

文章目录 1. 异常处理的基础1.1 使用 try 和 except1.2 捕获多种异常 2. 高级异常处理2.1 捕获所有异常2.2 使用 else 和 finally 3. 异常链与自定义异常3.1 异常链3.2 自定义异常 有效管理和处理异常是构建健壮、可靠和用户友好应用程序的基石。异常处理不仅有助于防止程序意外…

衣康酸(ITA)应用领域广泛 工业发酵法为其主流制备方法

衣康酸&#xff08;ITA&#xff09;应用领域广泛 工业发酵法为其主流制备方法 衣康酸&#xff08;ITA&#xff09;又称亚甲基丁二酸、甲叉琥珀酸&#xff0c;化学式为C5H6O4&#xff0c;是一种不饱和二元有机酸。衣康酸外观呈白色结晶粉末&#xff0c;含强烈刺激性气味&#xf…

Spring Boot 框架集成Knife4j

本次示例使用 Spring Boot 作为脚手架来快速集成 Knife4j,Spring Boot 版本2.3.5.RELEASE,Knife4j 版本2.0.7&#xff0c;完整代码可以去参考 knife4j-spring-boot-fast-demo pom.xml 完整文件代码如下 <?xml version"1.0" encoding"UTF-8"?> &l…

看现货白银平台测评要注意的几个事项

在网上我们会看到很多现货白银平台测评的文章或短视频&#xff0c;我们要注意&#xff0c;这些测评内容包括本文在内&#xff0c;多少都会存在着一些主观性的东西&#xff0c;这是无可避免的。不过在看现货白银平台测评时&#xff0c;有一些客观的东西&#xff0c;是需要我们留…

专注底层技术创新,超高性能公链新星 Sui Network 有何独特优势?

近年来&#xff0c;Sui Network 为了能够打造让开发者低成本实现广泛应用开发的公链环境付诸实际行动。其建立了以对象为中心的数据模型、在交易签名和 PTB 中实现精细化权限、优化用户友好功能&#xff0c;逐步为开发者和用户提供了一个更为灵活、安全的链上运行环境。在优越技…

【吊打面试官系列】Java高并发篇 -为什么使用 Executor 框架比使用应用创建和管理线程好?

大家好&#xff0c;我是锋哥。今天分享关于 【为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 为什么使用 Executor 框架比使用应用创建和管理线程好&#xff1f; 为什么要使用 Executor 线程池框架 1、每…

springboot 载入自定义的yml文件转DTO

改进方法&#xff0c;直接spring注入 import cn.hutool.json.JSONUtil; import org.springframework.beans.factory.config.YamlMapFactoryBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import …

开抖音小店需要用到哪些软件?全部都给大家整理好了,快来看看!

哈喽~我是电商月月 在抖音小店的运营过程中&#xff0c;选品上架&#xff0c;售后客服都是要靠软件辅助进行的 那开抖音小店到底会用到哪些软件&#xff1f;这些平台都叫什么&#xff1f; 今天我就给大家介绍一下抖音小店运营过程中会使用到的软件&#xff0c;干货满满&…