美文网首页
linux下共享内存

linux下共享内存

作者: 小雨启明 | 来源:发表于2018-09-13 23:08 被阅读0次
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;
}

相关文章

  • Linux共享内存

    这里介绍Linux下常见的共享内存技术。 1、 Linux XSI 的 IPC 下的共享内存机制 Linux XS...

  • linux下共享内存

    1、定义和理解 共享内存就是允许两个不相关的进程访问同一个逻辑内存。不同进程之间共享的内存通常安排为同一段物理内存...

  • 共享内存原理

    Linux的2.2.x内核支持多种共享内存方式,如mmap()系统调用,Posix共享内存,以及系统V共享内存。 ...

  • 共享内存

    Linux进程间通信 - 共享内存

  • Linux下的共享内存

    共享内存是最高效的IPC机制,具体概念参考[《《操作系统概念精要》基本概念整理之进程同步篇(二)》],(https...

  • Win32下的共享内存通信

    操作系统第四次大作业是有关Win32下的共享内存使用,因为有了之前linux下共享内存使用的经验,对于原理理解也容...

  • 深信服一面C++

    首先自我介绍 Linux中创建共享内存的方式?共享内存中起始地址是不是按照页的大小对齐?创建共享内存的时候物理页一...

  • 深信服一面C++

    首先自我介绍 Linux中创建共享内存的方式?共享内存中起始地址是不是按照页的大小对齐?创建共享内存的时候物理页一...

  • Linux共享内存

    共享内存是常用的进程之间的通信,两个进程可以直接共享访问同一块内存区域 一、共享内存的实现步骤如下: (1)创建共...

  • 探讨一下 Linux 共享内存的 N 种方式

    关于 Linux 共享内存,写得最好的应该是宋宝华的 《世上最好的共享内存》[https://cloud.tenc...

网友评论

      本文标题:linux下共享内存

      本文链接:https://www.haomeiwen.com/subject/wirggftx.html