第二十九章 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 共享内存区
共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...
随机推荐
- .Net Core 商城微服务项目系列(八):购物车
最近加班有点多,一周五天,四天加班到11点+,心很累.原因是我当前在的这个组比较特殊,相当于业务的架构组,要为其它的开发组提供服务和监控.所以最近更新的也少,不过这个元旦三天假应该会更新三篇. 这篇是 ...
- 微信小程序开发实战-天气小程序
园龄6年8个月了,还一篇文章都没写过,惭愧! 最近周末做了个天气预报小程序,在这里整理一下开发过程和注意点,给对小程序开发感兴趣的伙伴们提供点参考. 废话不多说,先上图最终效果: 下面进入正文: 第一 ...
- Python集训营45天—Day08 (文件操作)
目录 1. 文件操作介绍 2. 文件的读写 2.1 文本文件 2.2 二进制文件 2.3 JSON文件 3. 文件的定位,重命名和删除 4. 文件夹的相关操作 1. 文件操作介绍 大家应该听说过一句话 ...
- 详解http报文(2)-web容器是如何解析http报文的
摘要 在详解http报文一文中,详细介绍了http报文的文本结构.那么作为服务端,web容器是如何解析http报文的呢?本文以jetty和undertow容器为例,来解析web容器是如何处理http报 ...
- [Python] 豆瓣电影top250爬虫
1.分析 <li><div class="item">电影信息</div></li> 每个电影信息都是同样的格式,毕竟在服务器端是用 ...
- ELK 学习笔记之 elasticsearch启动时Warning解决办法
elasticsearch启动时Warning解决办法: 转载:http://www.dajiangtai.com/community/18136.do?origin=csdn-geek&dt ...
- C# 8 - Range 和 Index(范围和索引)
C# 7 的 Span C# 7 里面出现了Span这个数据类型,它可以表示另一个数据结构里连续相邻的一串数据,并且它是内存安全的. 例子: 这个图的输出是3,4,5,6. C# 8 的Range类型 ...
- bullet物理引擎与OpenGL结合 导入3D模型进行碰撞检测 以及画三角网格的坑
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11681069.html 一.初始化世界以及模型 /// 冲突配置包含内存的默认设置,冲突设置. ...
- 网页布局——grid语法属性详解
grid目前兼容性目前还可以,主流浏览器对它的支持力度很大,ie9,10宣布它未来不久会对它有很好的支持,目前则需要使用过时的语法.我相信不久的将来grid将成为每一个前端工作人员必备的布局技能. 属 ...
- Spring Boot 常用注解汇总
一.启动注解 @SpringBootApplication @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documen ...