共享内存

来源:互联网 发布:数据库设计第三范式 编辑:程序博客网 时间:2024/05/22 10:33
一、共享内存的基本概念:
           共享内存是IPC机制中的一种,他允许两个相关的进程访问 同一段内存,这是传递数据非常有效的一种方式。
                                                                                     
二、共享内存的基本函数
        1.创建 / 获取一段共享内存,并返回其描述符
          int shmget(key_t key, size_t size, int shmflg);
             参数: 
                            key:共享内存的键值
                            size:共享内存的大小
                            flag :打开共享内存的标识,如果使用IPC_CREAT标志则会穿件一段共享内存
         2.映射共享内存
          void *shmat(int shmid , const vois*shmaddr ,int shflg)
          函数的功能:把shmid指定的共享内存映射到进程的地址空间里    
          返回值
                            成功:返回映射到进程空间之后的内存地址
                            失败:返回-1
        参数说明:
                      shmid:要映射的共享内存的描述符
                      shmaddr:指定映射之后的地址,一般情况都让该参数为空,表明让linux系统自动的选择映射地址
                      shmflg:标志
        3.脱离共享内存
           int shmdt(const void* shmaddr)
                函数的功能:从进程地址中断掉与共享内存的关系。
                   返回值:  成功返回0 
                                    失败返回-1

                参数 :shmaddr
                               指明要断开的共享内存的映射地址
          4.删除共享内存
                 shmctl(int shmid , int cmd , struct shmid_ds *buf)
                  函数功能:控制共享内存
                      返回值
                                 成功:根据不同的值返回不同的值
                                 失败:返回-1
                     参数:
                                    shmid :要控制的共享内存的id
                                    cmd:决定执行什么样的控制命令,如IPC_RMID(表示删除)
                                    buf:获取linux中描述共享内存的shmid_ds结构(基本不使用)


三、共享内存的基本函数使用流程:

四、共享内存实例:
  write进程                                                                                        read进程
  1.创建共享内存                                                                                                                         1.创建./获取共享内存
  2.映射共享内存                                                                                                                         2.映射共享内存
  3.  循环         3.1    获取用户输入的字符串                                                                            3.循环
                3.2   将获取的字符串写入共享内存                                                                                                  3.1打印共享内存中的字符串,直到收到结束的通知
 4.断开共享内存                                                                                                                           4.脱离共享内存                                                                                                                                         
                                                                                                                                                       5.删除共享内存
                 
write.c
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
 
#define TEXT_SZ 2048
 
struct shared_use_st
{
int writen_by_you; //表明谁输入的
char some_text[TEXT_SZ]; //存放写入的字符串
};
 
int main()
{
int running =1; //定义循环标志
int shmid;
struct shared_use_st *shared_stuff;
char buffer[TEXT_SZ];
//1.创建共享内存
shmid=shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
if(shmid==-1)
{
printf("creat share memcry fail\n");
exit(EXIT_FAILURE);
}
//2.映射共享内存
shared_stuff =(struct shared_use_st*)shmat(shmid,NULL,0);
//3.循环
while(running)
{
while(shared_stuff->writen_by_you == 1)
{
sleep(1);
printf("wait read process\n");
}
//3.1获取用户输入
fgets(buffer,TEXT_SZ,stdin);
//3.2将用户输入的字符串放入共享内存
strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
shared_stuff->writen_by_you=1;
if(strcmp(buffer,"end",3)==0)
{
running=0;
}
}
//4.脱离共享内存
shmdt((const void*)shared_stuff);
return 1;
}

read.c
#include<sys/ipc.h>
#include<sys/shm.h>
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
 
 
#define TEXT_SZ 2048
struct shared_use_st
{
int writen_by_you; //表明谁输入的
char some_text[TEXT_SZ]; //存放写入的字符串
};
 
int main()
{
int shmid;
int running=1;
struct shared_use_st* shared_stuff;
//1.获取共享内存
shmid = shmget((key_t)1234,sizeof(struct shared_use_st),IPC_CREAT);
 
//2.映射共享内存
shared_stuff =(struct shared_use_st*) shmat(shmid,NULL,0);
shared_stuff->writen_by_you=0;
 
//3.循环
while(running)
{
//3.1打印共享内存
if(shared_stuff->writen_by_you ==1)
{
printf("write process %s\n",shared_stuff->some_text);
shared_stuff->writen_by_you=0;
}
 
if(strcmp(shared_stuff->some_text,"end",3)==0)
{
running=0;
}
}
 
 
//4.脱离共享内存
shmdt((const void*)shared_stuff);
//5.删除共享内存
shmctl(shmid,IPC_RMID,NULL);
 
return 1;
 
}
先运行read进程,然后在运行write进程


                    
  
0 0