IPC-shm 共享内存

2024-01-21 19:32
文章标签 ipc 共享内存 shm

本文主要是介绍IPC-shm 共享内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

a series of functions

       int shmget(key_t key, size_t size, int shmflg);
//两个进程若想共用一个物理内存区,只需在此处填写相同的key_t
//返回共享内存标示符,作为shmat的参数shmidvoid *shmat(int shmid, const void *shmaddr, int shmflg);
//返回虚拟内存首地址
//若参数shmaddr为空,让系统选择映射首地址int shmdt(const void *shmaddr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);struct shmid_ds {struct ipc_perm shm_perm;    /* Ownership and permissions */size_t          shm_segsz;   /* Size of segment (bytes) */time_t          shm_atime;   /* Last attach time */time_t          shm_dtime;   /* Last detach time */time_t          shm_ctime;   /* Last change time */pid_t           shm_cpid;    /* PID of creator */pid_t           shm_lpid;    /* PID of last shmat(2)/shmdt(2) */shmatt_t        shm_nattch;  /* No. of current attaches */...};

[root@localhost ch14]# cat shm1.c
/* Our first program is a consumer. After the headers the shared memory segment(the size of our shared memory structure) is created with a call to shmget,with the IPC_CREAT bit specified. */#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <sys/shm.h>#include "shm_com.h"int main()
{int running = 1;void *shared_memory = (void *)0;struct shared_use_st *shared_stuff;int shmid;srand((unsigned int)getpid());    shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);if (shmid == -1) {fprintf(stderr, "shmget failed\n");exit(EXIT_FAILURE);}/* We now make the shared memory accessible to the program. */shared_memory = shmat(shmid, (void *)0, 0);if (shared_memory == (void *)-1) {fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n", (int)shared_memory);/* The next portion of the program assigns the shared_memory segment to shared_stuff,which then prints out any text in written_by_you. The loop continues until end is foundin written_by_you. The call to sleep forces the consumer to sit in its critical section,which makes the producer wait. */shared_stuff = (struct shared_use_st *)shared_memory;shared_stuff->written_by_you = 0;while(running) {if (shared_stuff->written_by_you) {printf("You wrote: %s", shared_stuff->some_text);// sleep( rand() % 4 ); /* make the other process wait for us ! */shared_stuff->written_by_you = 0;if (strncmp(shared_stuff->some_text, "end", 3) == 0) {running = 0;}}}/* Lastly, the shared memory is detached and then deleted. */if (shmdt(shared_memory) == -1) {fprintf(stderr, "shmdt failed\n");exit(EXIT_FAILURE);}if (shmctl(shmid, IPC_RMID, 0) == -1) {fprintf(stderr, "shmctl(IPC_RMID) failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);
}[root@localhost ch14]# 
[root@localhost ch14]# cat shm2.c
/* The second program is the producer and allows us to enter data for consumers.It's very similar to shm1.c and looks like this. */#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>#include <sys/shm.h>#include "shm_com.h"int main()
{int running = 1;void *shared_memory = (void *)0;struct shared_use_st *shared_stuff;char buffer[BUFSIZ];int shmid;shmid = shmget((key_t)1234, sizeof(struct shared_use_st), 0666 | IPC_CREAT);if (shmid == -1) {fprintf(stderr, "shmget failed\n");exit(EXIT_FAILURE);}shared_memory = shmat(shmid, (void *)0, 0);if (shared_memory == (void *)-1) {fprintf(stderr, "shmat failed\n");exit(EXIT_FAILURE);}printf("Memory attached at %X\n", (int)shared_memory);shared_stuff = (struct shared_use_st *)shared_memory;while(running) {while(shared_stuff->written_by_you == 1) {sleep(1);            printf("waiting for client...\n");}printf("Enter some text: ");fgets(buffer, BUFSIZ, stdin);strncpy(shared_stuff->some_text, buffer, TEXT_SZ);shared_stuff->written_by_you = 1;if (strncmp(buffer, "end", 3) == 0) {running = 0;}}if (shmdt(shared_memory) == -1) {fprintf(stderr, "shmdt failed\n");exit(EXIT_FAILURE);}exit(EXIT_SUCCESS);
}
[root@localhost ch14]# <pre name="code" class="cpp">[root@localhost ch14]# ./shm1&
[3] 6209
[root@localhost ch14]# Memory attached at B77FF000
./shm2
Memory attached at B785B000
Enter some text: hello
You wrote: hello
waiting for client...
Enter some text: hi
You wrote: hi
waiting for client...
Enter some text: 
两个进程中的某段虚拟地址空间被映射到le同一段物理内存,
但是进程之间的读写时序de同步,需要进程自己来控制,例中用了共享内存中的
一个数据written_by_you来指示各个进程的动作
还可使用信号量和消息实现同步


 
 
 

                                    

这篇关于IPC-shm 共享内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630602

相关文章

【Linux】Linux 共享内存:高效的进程间通信

文章目录 Linux 共享内存:高效的进程间通信1. 什么是共享内存?2. 共享内存的实现步骤2.1 创建共享内存2.2 映射共享内存2.3 读写共享内存2.4 解除映射和删除共享内存 3. 共享内存的同步问题信号量示例: 4. 共享内存的优势与劣势优势:劣势: 5. 使用场景6. 结论 Linux 共享内存:高效的进程间通信 共享内存(Shared Memory)是 Li

理解C++全局对象析构顺序与 IPC 资源管理:避免 coredump

文章目录 0. 概述1. 问题背景2. 问题分析3. 解决方案:手动释放资源4. 深入剖析:为什么手动调用 `reset()` 有效?5. 延伸思考:如何避免全局对象带来的问题?6. 总结 0. 概述 在编写 C++ 程序时,使用全局或静态对象有时可能会导致不可预期的崩溃(如 coredump)。这类崩溃通常源于对象的析构顺序、资源的管理方式,以及底层资源(如 IPC 通道或共

Linux IPC 1 之 概述

Linux IPC 1 之 概述 Linux IPC 1 之 概述 背景进程的含义IPC的含义三个名词IPC的6种方式 背景: 以前学习研究的Linux进程间通信,经常不用都要忘了,而且发现写的博客也有些不够完整,所以干脆推倒重来,温故知新而已:) 进程的含义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着

【Linux】进程间通信(IPC)(第十四篇)

目录 1.消息队列 2.管道机制 1.匿名管道(PIPE) 2.命名管道 3.MMAP内存共享映射 4.信号 5.信号量 6.套接字 7.共享内存通信 进程用户空间是相互独立的,一般而言是不能相互访问的。但很多情况下进程间需要互相通信,来完成系统的某项功能。进程通过与内核及其它进程之间的互相通信来协调它们的行为。 1.进程间通信的应用场景 数据传输:一个进程需要

c++ linux——进程共享内存

共享内存概念: 每个进程的虚拟内存对应一块物理地址,如果两个进程需要共享某一块内存,则各自的虚拟内存会有一小块映射到同一片物理地址上。是最高效的进程间通信方式。 关键就是四个函数 shmget(创建或者获取现有的共享内存标识符) shmat (将共享内存挂接到当前进程) shmdt(共享内存与当前进程取消挂接) shctrl(删除共享内存或者改变权限) 举例实现: 进程1 #include<sy

Linux IPC 资源管理:ipcs和 ipcrm使用指南

文章目录 0. 引言1. IPC 资源概述2. 查询 IPC 资源2.1 使用 `ipcs` 查询 IPC 资源2.2 查询特定 IPC 资源2.3 查询系统 IPC 参数 3. 修改 IPC 系统参数4. 清除 IPC 资源5. 实践应用5.1 查询用户的消息队列5.2 查找未被清理的消息队列 0. 引言 进程间通信(IPC)允许不同的进程共享数据或进行同步操作。Linux

【Unix编程】进程间通信(IPC)

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 1、特点: 它是半双工

进程间通信方式(共享内存、信号灯集、消息队列)

共享内存 特点 1)共享内存是一种最为高效的进程间通信方式,进程可以直接读写内存,而不需要任何数据的拷贝。 2)为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程 将其映射到自己的私有地址空间。进程就可以直接读写这一内存区而不需要进行数据的拷贝,从而大大提高的效率。 3) 由于多个进程共享一段内存,因此也需要依靠某种同步机制,如互斥锁和信号量等 使

联咏NT98567高度集成边缘IPC应用SoC规格特性

联咏 NT98567MQG是一款高度集成的SoC,具有高图像质量、低比特率和低功耗的特点,适用于电池应用,目标是2Mp至5Mp/8Mp边缘IP摄像头应用。该SoC集成了双核ARM Cortex A7 CPU、新一代ISP、H.265/H.264视频压缩编解码器、视频处理引擎(VPE)用于双传感器拼接和鱼眼去畸变、高性能硬件DLA模块、图形引擎、显示控制器、以太网PHY、USB 2.0主机/

github源码指引:共享内存、数据结构与算法:树形结构ListTree

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。         专题:共享内存、数据结构与算法_初级代码游戏的博客-CSDN博客         本文讲解带有子项的链表。 一、介绍         与