linux共享内存总结

news/2024/10/17 22:14:22/

共享内存函数由shmget、shmat、shmdt、shmctl四个函数组成

头文件:

 #include <sys/ipc..h>

 #include<sys/shm.h>


 // 创建或获取一个共享内存: 成功返回共享内存ID,失败返回-1
 int shmget (key_t key, size_t_size, int flag);


 // 连接共享内存到当前进程的地址空间: 成功返回指向共享内存的指针,失败返回-1
 void *shmat (int shm_id, const void *addr, int flag);


 // 断开与共享内存的连接: 成功返回0,失败返回-1
 int shmdt (void *addr):


 // 控制共享内存的相关信息: 成功返回0,失败返回-1

 int shmctl (int shm_id, int cmd, struct shmid_ds *buf) 


当用shmget函数创建一段共享内存时,必须指定其 size;而如果引用一个已存在的共享内存,则将 size 指定为0
当一段共享内存被创建以后,它并不能被任何进程访问。必须使用shmat函数连接该共享内存到当前进程的地址空间,连接成功后把共享内存区对象映射到调用进程的地址空间,随后可像本地空间一样访问。

shmdt函数是用来断开shmat建立的连接的。注意,这并不是从系统中删除该共享内存,只是当前进程不能再访问该共享内存而已

shmct函数可以对共享内存执行多种操作,根据参数 cmd 执行相应的操作。常用的是IPC_RMID (从系统中删除该共享内存)。

封装共享内存读:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//int shmget(key_t key, size_t size, int shmflg);
int main()
{
    
    int shmid;
    char *shmaddr;

    
    key_t key;
    key = ftok(".",1);
    
    shmid = shmget(key,1024*4,0);
    if(shmid == -1){
        printf("shmget noOk\n");
        exit(-1);
    }
    shmaddr = shmat(shmid,0,0);

    printf("shmat ok\n");
    printf("data: %s\n:",shmaddr);

    shmdt(shmaddr);

    printf("quit\n");
    
    return 0;
}

封装共享内存写:

#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

//int shmget(key_t key, size_t size, int shmflg);
int main()
{
    
    int shmid;
    char *shmaddr;

    
    key_t key;
    key = ftok(".",1);
    
    shmid = shmget(key,1024*4,IPC_CREAT|0666);
    if(shmid == -1){
        printf("shmget noOk\n");
        exit(-1);
    }
    shmaddr = shmat(shmid,0,0);

    printf("shmat ok\n");
    strcpy(shmaddr,"ljxzgl");

    sleep(5);
    shmdt(shmaddr);
    shmctl(shmid, IPC_RMID, 0);

    printf("quit\n");
    
    return 0;:
}

编译结果:


http://www.ppmy.cn/news/80332.html

相关文章

图片翻译怎么弄?如何把图片翻译成中文?

在使用社交媒体时&#xff0c;可能会遇到来自世界各地的异文化信息&#xff0c;这时我们可以借助图片翻译的方法帮助我们更好地了解这些信息&#xff0c;促进跨文化交流。那么图片翻译怎么弄呢&#xff1f;图片翻译的方法有哪些呢&#xff1f;这篇文章给你推荐三个非常好用的图…

ROS学习(5)——话题消息与服务

节点之间的消息通信分为几种形式&#xff1a; 话题(topic):单向消息发送/接收方式服务(service):双向消息请求/响应方式动作(action):双向消息目标(goal)/结果(result)/反馈(feedback)方式参数服务器(参数共享模式) 种类区别话题异步单向连续单向的发送/接收数据的情况服务同步…

安装编译PostgreSql15.3.0

一、下载源码 方式一 官网手动下载 https://www.postgresql.org/download/. 解压 tar -zxvf postgresql-14.2.tar.gz方式二 git clone git clone https://github.com/postgres/postgres.git解压或下载后计入postgres目录 cd postgres-15.3二、创建目录 用root账户创建 创建…

Vue电商项目--平台售卖属性和的排序操作制作

平台售卖属性的操作 就是点击平台的售卖属性&#xff0c;下面显示对应的内容 这里我们要借助这个props属性 这里块是平台的售卖属性&#xff0c;我们在这里绑定回调&#xff0c;一点击就把id传给父组件 我们需要把这俩个参数传进入 商品属性的数组: ["属性ID:属性值:…

js中setinterval怎么用?怎么才能让setinterval停下来?

setinterval()是定时调用的函数&#xff0c;可按照指定的周期&#xff08;以毫秒计&#xff09;来调用函数或计算表达式。 setinterval()的作用是在播放动画的时&#xff0c;每隔一定时间就调用函数&#xff0c;方法或对象。 setInterval() 方法会不停地调用函数&#xff0c;…

多态的原理、单继承和多继承的虚函数表、以及虚函数表的打印。

一、多态原理 1、下面这个结果是多少&#xff1f; class A { public:virtual void func(){cout << "func()" << endl;}private:int _a 1; };int main() {printf("%d\n", sizeof(A));return 0; } 是 4&#xff1f;8&#xff1f;还是多少&am…

CSS3多列布局:达到无与伦比的网站排版

随着互联网技术的日益发展&#xff0c;网站排版也变得越来越重要。对于网站设计师而言&#xff0c;如何用 CSS3 实现美观、简洁、灵活的多列布局是一项必修的技能。在本篇文章中&#xff0c;我们将会一步步介绍 CSS3 多列布局的使用方法&#xff0c;带你完成一个完整的布局&…

npm i 常见问题

需要注意的是&#xff0c;如果你在使用 NPM 安装包的过程中遇到了任何问题&#xff0c;可以尝试使用 --verbose 参数打印更详细的错误信息&#xff0c;以便更好地诊断问题。例如&#xff1a; npm install --verbose 1、vue老项目缺少编译环境安装依赖报错的问题 待下载的项目…