linux下共享内存

1、定义和理解

共享内存就是允许两个不相关的进程访问同一个逻辑内存。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

2、使用流程
1)创建共享内存 shmget

函数原型

int shmget(key_t key, size_t size, int flags);
  • 参数 key:用户给定的键值。

  • 参数 size:共享内存的大小。

  • 参数 flags:可选项 。

  • 返回值:shm_id。

2)将共享内存挂载到线性地址上 shmat -- at:attach

函数原型

void *shmat(int shm_id, const void *shm_addr, int shmflg);
  • shm_id:shm_id是由shmget()函数返回的共享内存标识。

  • shm_addr:shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。

  • shmflg:shm_flg是一组标志位,通常为0。

  • 返回值:调用成功时返回一个指向共享内存第一个字节的指针,如果调用失败返回-1.

3)从进程中卸载该共享内存 shmdt -- dt:detach
int shmdt(const void *shm_addr);
  • shm_addr: shm_addr是shmat()函数返回的地址指针,调用成功时返回0,失败时返回-1.
4)控制共享内存 shmctl()函数 -- ctl:control
int shmctl(int shm_id, int command, struct shmid_ds *buf);

函数参考:https://www.cnblogs.com/52php/p/5861372.html

3、简单示例 无错误处理

查看ipc命令 ipcs

# a.c
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<string.h>

int main(){
    int id = shmget(0x8888,4096,IPC_CREAT|IPC_EXCL|0664);
    printf("%d\n",id);

    char * buf = shmat(id,NULL,0);

    strcpy(buf,"12345\n");

    shmdt(buf);

    return 0;
}
#b.c
#include<unistd.h>
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<string.h>

int main(){
    int id = shmget(0x8888,0,0);
    printf("%d\n",id);

    char *buf = shmat(id,NULL,0);
    printf("%s\n",buf);
    shmdt(buf);
    return 0;
}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容