MINIGUI与共享内存

来源:互联网 发布:java发布rest接口实例 编辑:程序博客网 时间:2024/05/07 13:00
 

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