一、共享内存的基本概念:
共享内存是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进程