共享内存

来源:互联网 发布:瓦尔特刀具软件 编辑:程序博客网 时间:2024/05/21 17:36

原创:http://blog.sina.com.cn/u/2312748742

 一、创建共享内存
    int shmget(key_t key,size_t size,int shmflg);
二、共享内存段刚被创建的时候,任何进程还都不能去访问它,比较把他们连接到自己的逻辑地址空间,
    由shmat函数连接。
    void *shmat(int shm_id,const void *shm_addr,int shmflg);
    连接后会返回地址指针。
三、根据该返回的地址指针就可以进行读和写

四、把共享内存与当前进程脱离,该操作并没有删除这个共享内存,只是当前内存不能再继续访问它而已
    int shmdt(const void *shm_addr);
五、删除共享内存
    intshmctl(int shm_id,int command,struct shmid_ds *buf);

 

例子:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ERR_INFO(info)\
do\
\
 perror(info);\
 exit(EXIT_FAILURE);\
}while(0);  //与分好结束
#define MAX_SIZE 1000
int main(int argc, char *argv[])
{
 if(argc<3)
 {
   ERR_INFO("paramserror\n!"); 
 }
 intshmId=shmget((key_t)1111,MAX_SIZE,IPC_CREAT|IPC_EXCL|0777);//创建共享内存
 if(shmId==-1)  //内存创建失败
 {
  if(errno==EEXIST)
   {
    printf("exitssharememory\n"); 
    shmId=shmget((key_t)1111,MAX_SIZE,0777);
   }
   else
   {
    ERR_INFO("shmgeterror!\n");   
   }
 }
 void *buffer=NULL;
 buffer=shmat(shmId,NULL,0);//连接函数把shmid内存空间的地址映射到进程自有逻辑内存地址shmaddr中。
 if(buffer==(void *)-1)
 {
  ERR_INFO("shmaterror!\n");
 }
 if(strncmp(argv[1],"write",5)==0)
 {
   strcpy((char*)buffer,argv[2]);
   printf("writeinfo:%s\n",buffer); 
 }
 else if(strncmp(argv[1],"read",4)==0)
 {
  printf("readinfo:%s\n",buffer); 
  shmdt(buffer);
  shmctl(shmId,IPC_RMID,NULL); 
 }
 return 0;
}

//输入 g++ shm.cpp -o main

//运行 ./main write "hello world"

//运行 ./main read 1

//运行 ipcs查看

原创粉丝点击