第二十九章 System V共享内存
共享内存数据结构

共享内存函数
shmget
int shmget(key_t key, size_t size, int shmflg);
功能:
用于创建共享内存
参数:
key : 这个共享内存段名字
size : 共享内存大小
shmflg : 由9个权限位标志构成,它们的用法与创建文件时使用的mode模式标志是一样的
返回值:
成功 : 返回一个非负整数,即该共享内存段的标识码
失败 : -1
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0)
typedef struct str
{
char name[32];
int age;
}STU;
int main(int argc, char* argv[])
{
int shmid;
shmid = shmget(1234, sizeof(STU), IPC_CREAT|0666);
if(shmid == -1)
ERR_EXIT("shmget");
return 0;
}
结果
ipcs
------------ 共享内存段 --------------
键 shmid 拥有者 权限 字节 连接数 状态
0x000004d2 9011220 dw 666 36 0
shmat
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:
将共享内存段连接到进程地址空间
参数:
shmid : 共享内存标识
shmaddr : 指定连接的地址
NULL : 核心自动选择一个地址
not NULL && 未设置SHM_RND标记,则以shmaddr为连接地址
not NULL && 设置了SHM_RND标记,则连接的地址会自动往下调整为SHMLBA的整数倍。公式 : shmaddr - (shmaddr % SHMLBA)
shmflg :
SHM_RND
SHM_RDONLY : 表示连接操作用来只读共享内存
返回值:
成功 : 返回一个指针,指向共享内存第一节
失败 : -1
shmdt
int shmdt(const void *shmaddr)
功能:
将共享内存段与当前进程脱离
参数:
shmaddr : 由shmat所返回的指针
返回值:
成功 : 0
失败 : -1
注意:
将共享内存段与当前进程脱离不等于删除共享内存段
shmget_write.c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0)
typedef struct str
{
char name[32];
int age;
}STU;
int main(int argc, char* argv[])
{
int shmid;
shmid = shmget(1234, sizeof(STU), IPC_CREAT|0666);
if(shmid == -1)
ERR_EXIT("shmget");
STU *p;
//自动分配地址且可读可写
p = shmat( shmid, NULL, 0);
if(p == (void*)-1)
ERR_EXIT("shmat");
strcpy(p->name, "xiaoming");
p->age = 20;
sleep(10);
shmdt(p);
return 0;
}
结果
进程退出前
ipcs
------------ 共享内存段 --------------
键 shmid 拥有者 权限 字节 连接数 状态
0x000004d2 9011220 dw 666 36 1
进程退出后
ipcs
------------ 共享内存段 --------------
键 shmid 拥有者 权限 字节 连接数 状态
0x000004d2 9011220 dw 666 36 0
shmget_read.c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0)
typedef struct str
{
char name[32];
int age;
}STU;
int main(int argc, char* argv[])
{
int shmid;
//第二个参数,如果不知道大小可以填0
// shmid = shmget(1234, sizeof(STU), IPC_CREAT|0666);
shmid = shmget(1234, 0, 0);
if(shmid == -1)
ERR_EXIT("shmget");
STU *p;
//自动分配地址且可读可写
p = shmat( shmid, NULL, 0);
if(p == (void*)-1)
ERR_EXIT("shmat");
printf("name : %s age : %d \n",p->name, p->age);
shmdt(p);
return 0;
}
shmctl
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:
用来控制共享内存
参数:
shmid : 共享内存标识
cmd : 要采取的操作
IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。
IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值
IPC_RMID:删除共享内存段
buf : 是一个结构指针,它指向共享内存模式和访问权限的结构
返回值:
成功 : 0
失败 : -1
共享内存示例
shmget_write.c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0)
typedef struct str
{
char name[32];
int age;
}STU;
int main(int argc, char* argv[])
{
int shmid;
shmid = shmget(1234, sizeof(STU), IPC_CREAT|0666);
if(shmid == -1)
ERR_EXIT("shmget");
STU *p;
//自动分配地址且可读可写
p = shmat( shmid, NULL, 0);
if(p == (void*)-1)
ERR_EXIT("shmat");
strcpy(p->name, "xiaoming");
p->age = 20;
while(1)
{
if(memcmp(p, "quit", 4) == 0)
break;
}
shmdt(p);
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
shmget_read.c
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
} while (0)
typedef struct str
{
char name[32];
int age;
}STU;
int main(int argc, char* argv[])
{
int shmid;
//第二个参数,如果不知道大小可以填0
// shmid = shmget(1234, sizeof(STU), IPC_CREAT|0666);
shmid = shmget(1234, 0, 0);
if(shmid == -1)
ERR_EXIT("shmget");
STU *p;
//自动分配地址且可读可写
p = shmat( shmid, NULL, 0);
if(p == (void*)-1)
ERR_EXIT("shmat");
printf("name : %s age : %d \n",p->name, p->age);
memcpy(p, "quit", 4);
shmdt(p);
return 0;
}
第二十九章 System V共享内存的更多相关文章
- 第二十五章 system v消息队列(一)
IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...
- 第三十三章 System V共享内存与信号量综合
用信号量解决生产者.消费者问题 实现shmfifo ip.h #ifndef _IPC_H #define _IPC_H #include <unistd.h> #include < ...
- 第二十六章 system v消息队列(二)
msgsnd int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 作用: 把一条消息添加到消息队列中 参数: msqi ...
- System V共享内存介绍
(一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...
- Linux system v 共享内存
system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...
- linux网络编程之system v共享内存
接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...
- Linux进程通信之System V共享内存
前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...
- 阐述linux IPC(五岁以下儿童):system V共享内存
[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途] system V共享内存和posix ...
- UNIX环境高级编程——System V 共享内存区
共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...
随机推荐
- Spring Boot 2.x基础教程:JSR-303实现请求参数校验
请求参数的校验是很多新手开发非常容易犯错,或存在较多改进点的常见场景.比较常见的问题主要表现在以下几个方面: 仅依靠前端框架解决参数校验,缺失服务端的校验.这种情况常见于需要同时开发前后端的时候,虽然 ...
- 使用Ingress来负载分发微服务
目录 使用Ingress来负载分发微服务 Demo规划 准备Demo并完成部署 创建部署(Deployment)资源 创建服务(Service)资源 创建Ingress资源并配置转发规则 ...
- python Django中的cookie和session
目录 Cookie 1.1获取Cookie 1.2设置Cookie Session 1.数据库Session 2.缓存Session 3.文件Session 4.缓存+数据库Session Cooki ...
- Mongoose: aggregate聚合 $group使用说明
aggregate聚合是通过管道操作实现的.聚合管道里的每一步输出,都会作为下一步的输入,每一步在输入文档执行完操作后生成输出文档. 聚合管道: $project 修改输入文档的结构.可以用来重命名 ...
- Windows10搭建开发环境----MySQL8.0.17安装
Windows10 MySQL8解压版最新最全图文安装配置 一.官网下载解压版安装包 MySQL官网 1. 进入官网点击downloads,如图: 2. 翻到网页底部,点击如图位置: 3. 点击MyS ...
- 分享8点超级有用的Python编程建议
我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,现在在这里分享一下给大家,希望多少有些地方可以给大家借鉴.
- 我又不是你的谁--java instanceof操作符用法揭秘
背景故事 <曾经最美>是朱铭捷演唱的一首歌曲,由陈佳明填词,叶良俊谱曲,是电视剧<水晶之恋>的主题曲.歌曲时长4分28秒. 歌曲歌词: 看不穿你的眼睛 藏有多少悲和喜 像冰雪细 ...
- SEER区块浏览器开发指南
区块浏览器基本功能 区块链浏览器是浏览区块链信息的主要窗口,每一个区块所记载的内容都可以从区块链浏览器上进行查阅.用户可以使用区块链浏览器查询记录在区块中的交易信息,包括转账.预测.账户管理和社区治理 ...
- API---注册表编程
首先来认识一下键,项,值吧: 左边有五个根键: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USER HKEY_CURREN ...
- java-try,return和finally相遇时的各种情况
今天碰到了这样一个问题:使用try,return和finally会碰到的各种情况1,try中有return时,执行顺序:2,try和finally中都有return时,执行顺序:3,运算代码在fina ...