共享内存数据结构

共享内存函数

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共享内存的更多相关文章

  1. 第二十五章 system v消息队列(一)

    IPC对象的持续性 随进程持续 :一直存在直到打开的最后一个进程结束.(如pipe和FIFO) 随内核持续 :一直存在直到内核自举(内核自举就是把主引导记录加载到内存,并跳转执行这段内存)或显示删除( ...

  2. 第三十三章 System V共享内存与信号量综合

    用信号量解决生产者.消费者问题 实现shmfifo ip.h #ifndef _IPC_H #define _IPC_H #include <unistd.h> #include < ...

  3. 第二十六章 system v消息队列(二)

    msgsnd int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg); 作用: 把一条消息添加到消息队列中 参数: msqi ...

  4. System V共享内存介绍

    (一)简单概念 共享内存作为一种进程间通信的方式,其相较于其他进程间通信方式而言最大的优点就是数据传输速率快.其内部实现的方式采用了Linux进程地址空间中的mmap文件映射区,将文件内容直接映射到各 ...

  5. Linux system v 共享内存

    system v 共享内存 #include <sys/types.h> #include <sys/shm.h> int shmget(key_t key, size_t s ...

  6. linux网络编程之system v共享内存

    接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...

  7. Linux进程通信之System V共享内存

    前面已经介绍过了POSIX共享内存区,System V共享内存区在概念上类似POSIX共享内存区,POSIX共享内存区的使用是调用shm_open创建共享内存区后调用mmap进行内存区的映射,而Sys ...

  8. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  9. UNIX环境高级编程——System V 共享内存区

    共享内存区域是被多个进程共享的一部分物理内存.如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信.共享内存是进程间共享数据的一种最 ...

随机推荐

  1. OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...

  2. Oracle 存储过程判断语句正确写法和时间查询方法

    判断语句:if 条件 then   if  条件  then ************;   elsif  条件  then  ************;   elsif 条件  then ***** ...

  3. latex转word公式 java (latextoword,latex_word,latex2word,latex_omml)

    latex_word 主要目的:     给大家分享一个我的原创作品:latex转为word公式(omml)工具 [java] 此工具主要用于将含有latex公式的文本下载成word时,将latex转 ...

  4. MySql5.5安装步骤及MySql_Front视图配置

    一.下载文件 有需要的朋友,请自行到百度云下载 链接:https://pan.baidu.com/s/13Cf1VohMz_a0czBI05UqJg 提取码:cmyq 二.安装MySql 2.1.运行 ...

  5. c++第一个程序“Hello world!”

    c++第一个程序“Hello world!” 打开编译器(这里以vs2013为例) 单击新建项目 选择Win32 控制台应用程序 点击右下角确定 点击完成  点击解决方案管理器  新建cpp文件  右 ...

  6. 设计模式----创建型模式之工厂模式(FactoryPattern)

    工厂模式主要分为三种简单工厂模式.工厂方法模式.抽象工厂模式三种.顾名思义,工厂主要是生产产品,作为顾客或者商家,我们不考虑工厂内部是怎么一个流程,我们要的是最终产品.将该种思路放在我们面向对象开发实 ...

  7. 学Python的第一天

    第一天学习笔记 一.安装typroa 下载软件typroa用于日常学习笔记记录,该软件支持markdown语法 步骤: 官网地址:https://typora.io/ 选择版本安装(以windows为 ...

  8. LeetCode_20-Valid Parentheses

    给定一个字符串,其中包含字符’(’,’)’,’[’,’]’,’{‘,’}’,左括号必须匹配右括号,一对匹配的括号不能单独出现单个左括号或者右括号.如:(()[])有效,[(])无效空字符串也算是有效的 ...

  9. c#之线程基础(一)

    可以认为线程是一个虚拟进程,用于独立运行一个特定的程序. 1.使用c#创建线程 using System; using System.Threading; //3 namespace MutiThre ...

  10. PMP 德尔菲技术

    1.德尔菲技术,必须遵守以下几个规则: 每个专家只与主持人单线联系. 专家之间完全背靠背,更不能进行讨论.为保证专家提出独立见解,甚至需要把专家分散在不同的物理地点. 专家以匿名的书面形式提出意见. ...