share memory - Linux IPC

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

shmem相关函数:

    #include <sys/shm.h>

    int shmget(key_t key, size_t size, int shmflg);
    void *shmat(int shm_id, const void *shm_addr, int shmflg);
    int shmdt(const void *shm_addr);
    int shmctl(int shm_id, int cmd, struct shmid_ds *buf);

1.shmget()函数:创建共享内存

    int shmget(key_t key, size_t size, int shmflg);

参数:
key : 为共享内存段命名。有一个特殊的键值IPC_PRIVATE, 用于创建一个只属于创建进程的共享内存。
size: 以字节为单位指定需要共享的内存容量。
shmflag: 包含9个比特的权限标志,作用与创建文件时的mode标志一样。由IPC_CREAT定义的一个特殊比特,须和权限标志按位或才能创建一个新的共享内存段。

NOTE:
权限标志对共享内存非常有用,因为它允许一个进程创建的共享内存可以被共享内存的创建者所拥有的进程写入,同时其它用户创建的进程只能读取共享内存。

可利用该功能来提供一种有效的对数据进行只读访问的方法,通过将数据放共享内存并设置它的权限,以避免数据被其他用户修改。

返回值:
创建成功,则返回一个非负整数,即共享内存标识;
如果失败,则返回-1.

2.shmat()函数:连接共享内存到当前进程地址空间
第一次创建共享内存段时,它不能被任何进程访问。要想启动对该内存的访问,必须将其连接到一个进程的地址空间。

    void *shmat(int shm_id, const void *shm_addr, int shmflg);

参数:
shm_id : 由shmget返回的共享内存标识。
shm_add: 指定共享内存连接到当前进程中的地址位置。它通常是一个空指针, 表示让系统来选择共享内存出现的地址。
shmflg : 是一组标志。
它的两个可能取值是:
SHM_RND和shm_add联合使用,控制共享内存连接的地址。
SHM_RDONLY:使连接的内存只读

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

共享内存的读写权限由它的属主(共享内存的创建者),它的访问权限和当前进程的属主决定。共享内存的访问权限类似于文件的访问权限。

3.shmdt()函数:将共享内存从当前进程中分离。

int shmdt(const void *shm_addr);

shm_addr: shmat()函数返回的地址指针。

成功时,返回0,
失败时,返回-1.

NOTE:
共享内存分离并未删除它,
只是使得该共享内存对当前进程不再可用。

4.shmctl(࿰

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值