共享内存相关概念和使用函数:
共享内存是在多个进程之间共享和传递数据的一种方式。它允许两个不相关的进程访问同一个逻辑内存,共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式。
共享内存是由IPC为进程创建的一个特殊的地址范围,它将出现在该进程的地址空间中。其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存的地址。如果一个进程向共享内存写入了数据,所做的改动将立刻被可以访问同一段共享内存的任何其他进程看到。
1、共享内存的步骤
①创建共享,打开共享内存,使用shmget函数
②映射共享内存,将这段创建的共享内存内在映射到具体的进程空间去,使用shmat函数
③分离共享内存
④控制,删除共享内在
2、共享内存是被多个进程共享的一部分物理内存。共享内存是进程间共享数据的一种最快的方法
3、创建共享内存函数(shmget函数)
shmget函数
函数的作用:在内核中创建共享内存
函数的原型:int shmget(key_t key,int size,int shmflg);
函数的参数:key:键值;IPC_PRIVATE,私有的键值
size:创建的内存的大小
shmflg:类似open的权限
函数的返回值:成功:共享内存标识符;出错:-1
头文件:#include #include
4、映射共享内存函数(shmat函数)
shmat函数
函数的作用:映射共享内存,映射到各自的内存空间
函数的原型:void *shmat(int shmid,const void * shmaddr,int flag);
函数的参数:shmid:内存标识符
shmaddr:映射共享内存到本进程的指定地址,如果为NULL则由内核自动分配
shmflg:SHM_RDONLY表示共享内存只读;为0表示共享内存可读写
函数的返回值:成功:被映射的段地址;出错:-1
头文件:#include #include #include
5、撤销共享内存函数(shmdt函数)
shmdt函数
函数的作用:撤销共享内存的映射
函数的原型:int shmdt(const void *shmaddr);
函数的参数:shnaddr:被映射的共享内存的地址
返回值:成功:0;出错:-1
函数实现代码:
写:#include
#include
#include
#include
#include
#include
#include
#include "shm_com.h"
int main(void)
{
int running=1;
void *shared_memory=(void *)0;
struct shared_use_st *shared_stuff;
int shmid;
shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmget failed
");
exit(EXIT_FAILURE);
}
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memory==(void *)-1)
{
fprintf(stderr,"shmat failed
");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X
",(int)shared_memory);
shared_stuff=(struct shared_use_st *)shared_memory;
shared_stuff->written_by_you=0;
while(running)
{
if(shared_stuff->written_by_you)
{
printf("You wrote:%s",shared_stuff->some_text);
sleep(1);
shared_stuff->written_by_you=0;
if(strncmp(shared_stuff->some_text,"end",3)==0)
{
running=0;
}
}
}
if(shmdt(shared_memory)==-1)
{
fprintf(stderr,"shmdt failed
");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
读:
#include
#include
#include
#include
#include
#include
#include
#include "shm_com.h"
int main(void)
{
int running=1;
void *shared_memory=(void *)0;
struct shared_use_st *shared_stuff;
char buffer[BUFSIZ];
int shmid;
shmid=shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid==-1)
{
fprintf(stderr,"shmget failed
");
exit(EXIT_FAILURE);
}
shared_memory=shmat(shmid,(void *)0,0);
if(shared_memory==(void *)-1)
{
fprintf(stderr,"shmat failed
");
exit(EXIT_FAILURE);
}
printf("Memory attached at %X
",(int)shared_memory);
shared_stuff=(struct shared_use_st *)shared_memory;
while(running)
{
while(shared_stuff->written_by_you==1)
{
sleep(1);
printf("waiting for client...
");
}
printf("Ener some text:");
fgets(buffer,BUFSIZ,stdin);
strncpy(shared_stuff->some_text,buffer,TEXT_SZ);
shared_stuff->written_by_you=1;
if(strncmp(buffer,"end",3)==0)
{
running=0;
}
}
if(shmdt(shared_memory)==-1)
{
fprintf(stderr,"shmdt failed
");
exit(EXIT_FAILURE);
}
exit(EXIT_SUCCESS);
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PERM S_IRUSR|S_IWUSR
int main(int argc,char **argv)
{
int shmid;
char *p_addr,*c_addr;
if(argc!=2)
{
fprintf(stderr,"Usage:%s
a",argv[0]);
exit(1);
}
if((shmid=shmget(IPC_PRIVATE,1024,PERM))==-1)
{
fprintf(stderr,"Create Share Memory Error:%s
a",strerror(errno));
exit(1);
}
if(fork())
{
p_addr=shmat(shmid,0,0);
memset(p_addr,'