MINIGUI与共享内存

2023-12-15 11:38
文章标签 共享内存 minigui

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

MINIGUI程序中测试共享内存成功

HELLOWORLD.C中加入文件声明:

#include <sys/ipc.h>

#include <sys/shm.h>

#include <sys/types.h>

#include <unistd.h>

主要函数为:

ftok

shmget

原型:int shmget(key_t key,int size,int shmflg);
返回值:如果成功,返回共享内存段标识符。如果失败,则返回-1

一旦一个进程拥有了一个给定的内存段的有效IPC标识符,它的下一步就是将共享的内存段映射到自己的地址空间中。

shmat

原型:int shmat ( int shmid, char *shmaddr, int shmflg);
返回值:如果成功,则返回共享内存段连接到进程中的地址。如果失败,则返回- 1errno = EINVAL (无效的IPC ID 值或者无效的地址)

旦内存段正确地连接到进程以后,进程中就有了一个指向该内存段的指针。这样,以后就可以使用指针来读取此内存段了。但一定要注意不能丢失该指针的初值。

shmdt

调用原型:int shmdt ( char *shmaddr );

  当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。但这不等于将共享内存段从系统内核中移走。当进程脱离成功后,数据结构shmid_ds中元素shm_nattch将减1。当此数值减为0以后,系统内核将物理上把内存段从系统内核中移走。

控制共享内存:如删除共享内存,获取共享内存状态等。
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:shmidshmid 共享内存的fd

 

注意:调用shmctl(shm_fd, IPC_RMID, 0)后共享内存释放。

 

感觉与WINDOWS系统下调用FILEMAPPING差不多。FTOK由于路径错误会返回错误,共享内存还是可以创建成功。

附网上的共享内存小程序:

/***** testwrite.c *******/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
 char name[4];
 int age;
} people;
main(int argc, char** argv)
{
 int shm_id,i;
 key_t key;
 char temp;
 people *p_map;
 char* name = "/dev/shm/myshm2";
 key = ftok(name,0);
 if(key==-1)
  perror("ftok error");
 shm_id=shmget(key,4096,IPC_CREAT); 
 if(shm_id==-1)
 {
  perror("shmget error");
  return;
 }
 p_map=(people*)shmat(shm_id,NULL,0);
 temp='a';
 for(i = 0;i<10;i++)
 {
  temp+=1;
  memcpy((*(p_map+i)).name,&temp,1);
  (*(p_map+i)).age=20+i;
 }
 if(shmdt(p_map)==-1)
  perror(" detach error ");
}

/********** testread.c ************/
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <unistd.h>
typedef struct{
 char name[4];
 int age;
} people;
main(int argc, char** argv)
{
 int shm_id,i;
 key_t key;
 people *p_map;
 char* name = "/dev/shm/myshm2";
 key = ftok(name,0);
 if(key == -1)
  perror("ftok error");
 shm_id = shmget(key,4096,IPC_CREAT); 
 if(shm_id == -1)
 {
  perror("shmget error");
  return;
 }
 p_map = (people*)shmat(shm_id,NULL,0);
 for(i = 0;i<10;i++)
 {
 printf( "name:%s/n",(*(p_map+i)).name );
 printf( "age %d/n",(*(p_map+i)).age );
 }
 if(shmdt(p_map) == -1)
  perror(" detach error ");
}

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



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

相关文章

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

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

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

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

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

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

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

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

C++共享内存交互方式

一、什么是共享内存 文件映射是一种实现进程间单向或双向通信的机制。它允许两个或多个本地进程间相互通信。为了共享文件或内存,所有的进程必须使用相同的文件映射的名字或是句柄。 说白了就是把内存当成磁盘,在内存上新建一个文件,其它进程只要知道这个文件的名字,就可以直接获取该内存文件上的数据。 二、实现步骤 为了实现共享文件,进程先调用OpenFileMapping方法,如果内存没有相应的文件可以使用::

共享内存的使用

一、共享内存的原理 共享内存是目前Linux进程间通信里面最高效、最简单的一种方式。它允许多个进程同时访问同一个内存,并不需要通过系统调用或者内核切换来完成,所以它的效率是所有IPC通信中最高的。在Linux开发中,共享内存常用于一个进程向另一个进程进行图像传输、结构体传输等。 共享内存的原理是它是从内核空间中申请一块内存区域,然后把这个区域的数据映射到不同的进程里面。然后多个进程

【Linux修行路】进程通信——共享内存

目录 ⛳️推荐 一、直接原理 1.1 共享内存的的申请 1.2 共享内存的释放 二、代码演示 2.1 shmget 2.1.1 详谈key——ftok 2.2 创建共享内存样例代码 2.3 获取共享内存——进一步封装 2.4 共享内存挂接——shmat 2.5 共享内存去关联——shmdt 2.6 释放共享内存——shmctl 2.7 开始通信 2.7.1 proc

IO进程day06(进程间通信、信号、共享内存)

目录 【1】进程间通信 IPC 1》 进程间通信方式 2》 无名管道 1> 特点 2> 函数接口 3> 注意事项 练习:父子进程实现通信,父进程循环从终端输入数据,子进程循环打印数据,当输入quit结束。 3》有名管道  1> 特点 2> 函数接口 3> 注意事项  练习:通过两个进程实现 cp功能  4> 有名管道和无名管道的区别 【2】信号  1》概念  2》信

windows下利用文件映射实现共享内存

windows下利用文件映射实现共享内存的办法比较简单,下面是实现代码,细节用注释说明. 调用类似linux下shm的操作.该类没有进行太多的测试,欢迎提出问题和bug~~:) #include <windows.h>#include <string>#include <iostream>#include <assert.h>using std::string;using std

github源码指引:共享内存、数据结构与算法:基于共享内存的散列存储hash

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