linux共享内存总结

简介: linux共享内存总结

1.共享内存概念:

共享内存(Shared Memory)就是允许多个进程访问同一个内存空间,是在多个进程之间共享和传递数据最 高效的方式。操作系统将不同进程之间共享内存安排为同一段物理内存,进程可以将共享内存连接到它们自 己的地址空间中,如果某个进程修改了共享内存中的数据,其它的进程读到的数据也将会改变。


2.相关函数

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

22ab4846bf52e5ee250bd67d22992697_142fedf0f21d4da79b820f9886a7e80f.png

头文件:


#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 (从系统中删除该共享内存)。


3.代码示例:


封装共享内存读:

#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;:
}

编译结果:

相关文章
|
1月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
101 6
|
2月前
|
Linux 调度
深入理解Linux虚拟内存管理(七)(下)
深入理解Linux虚拟内存管理(七)
49 4
|
2月前
|
存储 Linux 索引
深入理解Linux虚拟内存管理(九)(中)
深入理解Linux虚拟内存管理(九)
26 2
|
2月前
|
Linux 索引
深入理解Linux虚拟内存管理(九)(上)
深入理解Linux虚拟内存管理(九)
35 2
|
2月前
|
Linux
深入理解Linux虚拟内存管理(七)(中)
深入理解Linux虚拟内存管理(七)
30 2
|
2月前
|
机器学习/深度学习 消息中间件 Unix
深入理解Linux虚拟内存管理(九)(下)
深入理解Linux虚拟内存管理(九)
27 1
|
2月前
|
Linux
深入理解Linux虚拟内存管理(七)(上)
深入理解Linux虚拟内存管理(七)
38 1
|
2月前
|
Linux 开发者
深入理解Linux虚拟内存管理(五)(上)
深入理解Linux虚拟内存管理(五)
23 1
|
2月前
|
算法 Linux
深入理解Linux虚拟内存管理(四)(下)
深入理解Linux虚拟内存管理(四)
17 1
|
2月前
|
缓存 Linux 调度
Linux服务器如何查看CPU占用率、内存占用、带宽占用
Linux服务器如何查看CPU占用率、内存占用、带宽占用
248 0