Linux共享内存

  • 共享内存:进程直接访问共享内存,由使用者进行访问控制(互斥等)

  • 使用ipcs命令查看系统共享内存

POSIX 共享内存

有名共享内存

  • 多个进程通过共享内存的名字来获取同一块共享内存,实现共享
#include <stdio.h>
#include <sys/mman.h>       //memory management
#include <fcntl.h>          //include O_* macros
#include <unistd.h>
#include <stdint.h>struct shared_data_t {int32_t data;
};#define SHARED_MEM_NAME     "my_shared_memory"int main()
{/** 创建共享内存,其实就是一个共享文件* name: 不能写成/tmp/aaa.sem这样的格式,因为在linux下,sem都是创建在/dev/shm目录下* oflag:操作标志,包含: O_RDONLY,O_RDWR,O_CREAT,O_EXCL,O_TRUNC* mode: 设置创建的共享内存区对象的权限属性* return: 共享内存的文件描述符*/int shm_fd = shm_open(SHARED_MEM_NAME,O_CREAT | O_RDWR,0666);//将文件的大小修改为lengthftruncate(shm_fd, sizeof(struct shared_data_t));//将共享文件映射到进程内存空间struct shared_data_t* data = mmap(NULL, 1024, PROT_READ | PROT_WRITE,MAP_SHARED, shm_fd, 0);if(data == MAP_FAILED){printf("mmap failed!\n");}data->data = 12;//解除内存的映射munmap(data, sizeof(struct shared_data_t));//删除共享内存shm_unlink(SHARED_MEM_NAME);return 0;
}

匿名共享内存

  • 通过memfd_create()创建一个匿名共享内存,通过UNIX Socket的控制消息CMSG将该文件描述符fd传递给其它进程,其它进程对该fd进行mmap操作可以的得到共享内存得地址,从而实现内存的共享。
  • man memfd_create查看函数具体说明

System V 共享内存

#include <sys/ipc.h>
#include <sys/shm.h>#define PATH_NAME "./"
#define PROJ_ID		0x666
int main()
{//生成一个key来唯一标识一个共享内存key_t key = ftok(PATH_NAME, PROJ_ID);//根据key创建一个共享内存,key要唯一int shmid = shmget(key, 4096, IPC_CREAT | IPC_EXCL);//将共享内存连接到进程地址空间,返回共享内存的地址char* shmaddr = shmat(shmid, NULL, 0);shmaddr = "hello, shared memory!";//取消共享内存和进程的连接shmdt(shmaddr);//删除共享内存shmctl(shmid, IPC_RMID, NULL);}

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

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

相关文章

基于Python实现连锁咖啡店经营情况EDA分析【500010097】

导入模块 import pandas as pd import plotly.graph_objects as go from plotly.subplots import make_subplots import plotly.express as px获取数据 df pd.read_csv(r./data/coffeeshop.csv) data_exploration(df)数据缺失值情况 print(数据缺失值情况&#xff1a;) df.…

sqli-labs(Less-4) extractvalue闯关

extractvalue() - Xpath类型函数 1. 确认注入点如何闭合的方式 2. 爆出当前数据库的库名 http://127.0.0.1/sqlilabs/Less-4/?id1") and extractvalue(1,concat(~,(select database()))) --3. 爆出当前数据库的表名 http://127.0.0.1/sqlilabs/Less-4/?id1") …

API 集成测试工具Hitchhiker 0.1.1 正式发布

Hitchhiker 是一款开源的 Restful Api 集成测试工具&#xff0c;你可以在轻松部署到本地&#xff0c;和你的 team 成员一起管理 Api。 能做什么 * Team 协作开发 Api * Api 历史修改记录及支持 diff 展示 * 支持多环境变量及运行时变量 * 支持 Schedule 及批量 run * 不同…

【数据结构初阶】链表OJ

链表OJ 题目一&#xff1a;移除链表元素题目二&#xff1a;反转链表题目三&#xff1a;链表的中间节点题目四&#xff1a;链表中倒数第k个结点题目五&#xff1a;合并两个有序链表题目六&#xff1a;链表分割题目七&#xff1a;链表的回文结构题目八&#xff1a;相交链表题目九…

python实现双臂老虎机k-armed-bandit

老虎机&#xff0c;投入钱币会随机返还钱币&#xff08;reward&#xff09; 这里设置两台老虎机&#xff0c;一台均值500&#xff0c;标准差5&#xff0c;一台均值550&#xff0c;标准差10 初始值均为998&#xff0c;更新规则为reward之和/轮数 最后结果会在均值附近收敛 impo…

一些分享| 在线笔记、GIF图片生成方法

文章目录 在线笔记视频转GIF 本片博客旨在挖掘一些好用且免费的在线平台&#xff0c;持续更新中~ 正所谓科技解放双手&#xff0c;使用在线平台可以方便快捷地学习办公&#xff0c;节省时间。 在线笔记 语雀 https://www.yuque.com/dashboard 语雀是笔者用得最长最久的平台了…

C语言查看main函数的参数

这里写自定义目录标题 argc 代表参数的个数argv 代表参数的具体值&#xff0c;其中argv[0]代表的是可执行文件的名字&#xff0c;参考上图

《QT从基础到进阶·二十七》进度条QProgressBar

ui.ProgressBar.setValue(45); //45% ui.ProgressBar.setMin(0); ui.ProgressBar.setMax(255);0到100分为255份&#xff0c;值为215时&#xff0c;进度条为100/255*215 84% 点击主界面弹出进度条QProgressDialog 常用功能&#xff1a; setWindowFlags(Qt::Dialog | Qt::Cu…

基于Langchain-Chatchat的知识库问答系统

文章目录 文章背景构建知识库资源及相关配置相关问题检索问题检索结果不准确 LLM问题LLM回答错误、遗漏或多余 参考 文章背景 Langchain-Chatchat项目是一种利于langchain思想实现的基于本地知识库的问答应用&#xff0c;是一个可以实现完全本地化推理的知识库增强方案&#x…

排查线程阻塞问题

案例代码 package first;import java.util.concurrent.TimeUnit;public class DeadLock {private static volatile Object lock new Object();public static void main(String[] args) {new Thread(() -> {test1();}).start();new Thread(() -> {test2();}).start();}p…

如何解决3d max渲染效果图全白这类异常问题?

通过3d max渲染效果图时&#xff0c;经常会出现3Dmax渲染效果图全黑或是3Dmax渲染效果图全白这类异常问题。可能遇到这类问题较多的都是新手朋友。不知如何解决。 3dmax渲染出现异常的问题&#xff0c;该如何高效解决呢&#xff1f;今天小编这里整理几项知识点&#xff0c;大家…

java时间类

一、java时间类为什么这么复杂? java的时间类非常复杂&#xff0c;这是由于jdk1.0到jdk1.1的时间类设计存在缺陷&#xff0c;导致使用不方便&#xff0c;线程不安全等问题&#xff0c;所以在jdk1.8&#xff0c;java又重新加入了一些时间类替换之前的时间类&#xff0c;但是jd…