首页 > 系统相关 >C系统编程通信方式——共享内存

C系统编程通信方式——共享内存

时间:2024-10-20 17:22:17浏览次数:9  
标签:IPC 编程 通信 shm key shmid 共享内存 ID

        共享内存,标准IPC之一,也是进程间通信最快的一种方式。

1.概念

        所有的标准IPC都有一个内部ID作为唯一标识。内部ID的获取通过外部key,key的类型是key_t。key的获取方法有在头文件中定义所有key和通过ftok函数获取一个key。

key_t ftok(const char *pathname,int proj_id);
//pathname:有效的路径
//proj_id:非0的八位项目ID,一般采用一个字符

        通过key获取内部ID的函数都叫做xxxget。

        所有的标准IPC结构都提供一个xxxctl函数,该函数至少包含了查询,修改和删除的功能。

        所有IPC都是由内核管理,不需要手动删除。

2.共享内存(shared memory)

(1)原理

        内核以一块物理内存作为媒介,通常情况下一块物理内存只允许一个进程映射,共享内存实现了:允许所有进程对这块物理内存进行映射,当多个内存映射到这同一片内存空间时,便可以理解为进行了数据间的交换。

(2)编程使用

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/shm.h>
int main()
{
//1.获取key
key_t key=ftok("./",'x');
//2.使用shmget函数通过key创建/获取共享内存
int shmid=shmget(key,100,IPC_CREAT|0666);
//shmget参数一:上一步获取到的key,参数二:共享内存大小,参数三:创建时使用IPC_CREAT|0666
//3.使用shmat将共享内存映射到用户空间
char *p=shmat(shmid,NULL,0);
//shmat参数一:上一步获取的共享内存,参数二:映射地址,通常给零让系统自主选择,参数三:映射标志,通常给0
//4.像访问普通内存一样去访问共享内存(读/写)
//子进程写
if(!fork())
{
    while(1)
    {
        printf("请写入:");
        fgets(p,sizeof(p),stdin);
        strtok(p,"\n");
        printf("写入了%ld字节内容\n",strlen(p));
    }
}
//父进程读
while(1)
{
    printf("读到了%ld字节内容:%s\n",strlen(p),p);
    sleep(3);
}
//5.解除映射
shmdt(p);
return 0;
}

        以上只是使用例子,存在着实际不为合理的地方,供了解使用。

(3)shmcl函数

int shmcl(int shmid,int cmd,struct shmid_ds *buf);
//shmid:共享内存ID
//cmd:操作命令:IPC_STAT查询,IPC_SET修改,IPC_RMID删除
//buf:查询和修改时使用,查询时传出共享内存信息,设置时传入共享内存信息
struct shmid_ds {
   struct ipc_perm shm_perm;    /* 所有者和权限 */
   size_t          shm_segsz;   /* 共享内存大小 */
   time_t          shm_atime;   /* 最后挂接时间 */
   time_t          shm_dtime;   /* 最后脱接时间 */
   time_t          shm_ctime;   /* 最后一次修改时间 */
   pid_t           shm_cpid;    /* 创建者PID */
   pid_t           shm_lpid;    /* 最后挂接/脱接PID */
   shmatt_t        shm_nattch;  /* 当前挂接进程数 */
   ...
};

struct ipc_perm {
   key_t          __key;    /* key的值 */
   uid_t          uid;      /* --所有者ID */
   gid_t          gid;      /* --所有者组ID */
   uid_t          cuid;     /* 创建者ID */
   gid_t          cgid;     /* 创建者组ID */
   unsigned short mode;     /* --权限 + SHM_DEST and
                               SHM_LOCKED flags */
   unsigned short __seq;    /* Sequence number */
};
//其中只有uid,gid和mode可以修改

                        

标签:IPC,编程,通信,shm,key,shmid,共享内存,ID
From: https://blog.csdn.net/2303_76896902/article/details/143094084

相关文章

  • 基于nodejs+vue基于web的青少年编程课程评价系统[开题+源码+程序+论文]计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于青少年编程课程评价的研究,现有研究主要以传统课程评价为主,专门针对青少年编程课程这一新兴教育领域的评价研究较少。在国内外,传统课程评价体系已经......
  • 基于node.js+vue基于Android的“编程猿”学习App设计与实现(开题+程序+论文)计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,文末可获取源码系统程序文件列表开题报告内容一、选题背景关于基于Android的学习类App的研究,现有研究主要以通用型学习App为主,如语言学习类、考证辅导类等。专门针对编程学习领域的Android应用研究较少。因此本......
  • WebRTC快速上手,建立时通信流程
    目录媒体捕获创建RTCPeerConnection添加本地媒体流信令交互信令服务的实现错误处理连接状态监测使用成熟库简化开发媒体捕获首先,我们需要获取用户的媒体设备(通常是摄像头和麦克风)的视频和音频流。asyncfunctiongetMediaStream(){try{conststream=await......
  • 三,Java编程基础:深入理解数据类型与类型转换
    数据类型与类型转换在Java编程中,数据类型是定义变量存储数据的格式。Java是一种强类型语言,这意味着每个变量和表达式都有一个明确的数据类型。本文将深入探讨Java中的基本数据类型、引用数据类型以及类型转换,包括详细的示例和代码。基本数据类型Java的基本数据类型分为整数类型......
  • 2.1.2 话题通信基本操作A(C++)
    需求:编写发布订阅实现,要求发布方以10HZ(每秒10次)的频率发布文本消息,订阅方订阅消息并将消息内容打印输出。分析:在模型实现中,ROSmaster不需要实现,而连接的建立也已经被封装了,需要关注的关键点有三个:发布方接收方数据(此处为普通文本)流程:编写发布方实现;编写订阅......
  • C++编程-贪心算法2
    目录先言例题三:删数问题(NOI1994)题目描述算法分析标准程序-字符串String例题四:拦截导弹问题题目描述算法分析主要框架(标准程序)例题五:活动选择题目描述算法分析标准程序先言今天讲贪心算法的第3~5例题例题三:删数问题(NOI1994)题目描述【题目描述】输......
  • 编程小白如何成为大神:大学新生的最佳入门攻略
    编程已成为当代大学生的必备技能,但面对众多编程语言和学习资源,新生们常常感到迷茫。以下是大学新生入门编程的最佳路径,帮助你为大学生活和未来职业发展打下坚实基础。方向一:编程语言选择1.Python特点:语法简洁易懂,适合初学者;拥有丰富的库和框架。应用领域:数据分析、人工智......
  • 详解UDP-TCP网络编程
    目录UDP数据报套接字编程API代码示例--(回显)单个客户端UdpEchoServerUdpEchoClientUdpDictServer(词典)将服务端程序部署到云服务器上TCP流套接字编程API长短链接代码示例--(回显)多个客户端TcpEchoServerTcpEchoClientUDP数据报套接字编程APIDatagramSoc......
  • 深入浅出之cuda编程概念
    CUDA(ComputeUnifiedDeviceArchitecture)是NVIDIA推出的一种用于通用并行计算的编程模型和编程接口。它允许开发者利用NVIDIAGPU的强大计算能力来加速应用程序。CUDA编程涉及使用CUDAC/C++或CUDAFortran等语言编写代码,这些代码可以在GPU上并行执行,从而显著提高计算性能。......
  • 基于rp-pico 设计的MakeCode arcade 图形编程游戏机
            前段时间用rp-pico做了一个 MakeCodearcade感觉用起来还不错,关键是很便宜,如果有编程经验的家长也想给小孩一个编程游戏机可以做一个试试,当然自己玩也挺不错的,下面是硬件的地址,我也不是很会画板,比较水,凑合能用,可以自己再改改,按页面的介绍烧录。rp2040_arca......