博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MINIGUI与共享内存
阅读量:4078 次
发布时间:2019-05-25

本文共 2080 字,大约阅读时间需要 6 分钟。

 

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 ");
}

转载地址:http://vzini.baihongyu.com/

你可能感兴趣的文章
编译Android4.0源码时常见错误及解决办法
查看>>
Android 源码编译make的错误处理
查看>>
linux环境下C语言中sleep的问题
查看>>
ubuntu 12.04 安装 GMA3650驱动
查看>>
新版本的linux如何生成xorg.conf
查看>>
xorg.conf的编写
查看>>
启用SELinux时遇到的问题
查看>>
virbr0 虚拟网卡卸载方法
查看>>
No devices detected. Fatal server error: no screens found
查看>>
新版本的linux如何生成xorg.conf
查看>>
virbr0 虚拟网卡卸载方法
查看>>
Centos 6.0_x86-64 终于成功安装官方显卡驱动
查看>>
Linux基础教程:CentOS卸载KDE桌面
查看>>
db sql montior
查看>>
read humor_campus
查看>>
IBM WebSphere Commerce Analyzer
查看>>
Unix + OS IBM Aix FTP / wu-ftp / proftp
查看>>
my read work
查看>>
db db2 base / instance database tablespace container
查看>>
hd disk / disk raid / disk io / iops / iostat / iowait / iotop / iometer
查看>>