C语言 进程通讯 共享内存 示例(附带内核地址映射ioremap+控制函数ioctl)

获得key值,生成一个具有唯一性的ID,即队列的房间密码。在亲缘关系进程通信的时候,可以直接key = IPC_PRIVATE

key_t ftok(const char *pathname, int proj_id)

pathname:程序范围内已经存在的文件名加绝对路径

proj_id:只有8bits有效,若大于255则只有后8bits有效

返回值:成功 = key值,失败 = -1

创建共享内存

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

key:IPC_PRIVATE 或 ftok()得到的值

size:申请的共享内存大小(4K的倍数)

msgflg:共有9个权限标志,可填 IPC_CREAT | 0666  或 IPC_CREAT | IPC_EXCL | 0666 (判断IPC对象是否存在)

返回值:成功 = 共享内存的ID,失败 = -1

映射共享内存到用户空间

void *shmat(int shmid, const void *shmaddr, int shmflg)

shmid:共享内存的ID

shmaddr:NULL = 系统自动选择一个合适的地址

                 没有指定SHM_RND(命令取整)则共享内存链接到addr指定地址上

                 非0且指定SHM_RND(命令取整)则共享内存链接到shmaddr -(shmaddr mod SHMLAB【边界地址的倍数 2的n次方】)(该算式的意思是地址向下取最近的SHMLAB的倍数)

shmflg:映射到用户空间的共享内存的权限,SHM_RDONLY = 只读,0 = 读写

返回值:成功 = 映射到用户空间的地址,失败 = (void *)-1

撤销映射,进程结束时自动撤销映射

int shmdt(const void *shmaddr)

shmaddr:映射共享内存到用户空间的地址

返回值:

操作共享内存

删除共享内存时,不会立即删除,直到共享内存映射次数为0

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

shmid:共享内存的ID

cmd:指令,IPC_STAT = 获取共享内存的属性

                     IPC_SET = 设置共享内存的属性

                     IPC_RMID = 删除共享内存

buf:存放获取的共享内存属性

返回值:成功 = 0,失败 = -1

send.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <errno.h>

int main(int argc, char const *argv[])
{
    key_t k
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值