代码:
comm.h:
#ifndef _COMM_
#define _COMM_
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/types.h>
#include <sys/shm.h>
#include <string.h>
#define _PATH_ "."
#define _PROJ_ID_ 0x6602
int create_shm(int _size);
int get_shm(int _size);
int destory_shm(int shm_id);
void* attach(int shm_id);
int detach(void*);
#endif
comm.c:
#include "comm.h"
static int comm_shm(int _size,int flag)
{
key_t _key = ftok(_PATH_,_PROJ_ID_);
if(_key == -1){
perror("ftok");
return -1;
}
int shm_id = shmget(_key,_size,flag);
if(shm_id == -1)
{
perror("shmget");
return -2;
}
return shm_id;
}
int create_shm(int _size) //创建共享内存
{
int flag = IPC_CREAT|IPC_EXCL|0666;
return comm_shm(_size,flag);
}
int get_shm(int _size) //获取共享内存
{
int flag = IPC_CREAT;
return comm_shm(_size,flag);
}
int destory_shm(int shm_id)//释放共享内存
{
if(shmctl(shm_id,IPC_RMID,0) == -1)
{
perror("shmctl");
return -1;
}
return 0;
}
void* attach(int shm_id)
{//挂接,当server创建出共享内存,必须挂接上共享内存后才能访问共享内存,client也是
void* mem = NULL;
if(mem = shmat(shm_id,NULL,0)){
return mem;
}
return NULL;
}
int detach(void* addr)
{//分离,断开挂接
return shmdt(addr);
}
serve.c:
#include <stdio.h>
#include "comm.h"
int main()
{
int _size = 4096;
int shm_id = create_shm(_size);
sleep(10);
char* mem = (char*)attach(shm_id);
memset(mem,'\0',_size);
//读取共享内存数据
int count = 60;
while(count--){
printf("%s\n",mem);
sleep(1);
}
detach(mem);
destory_shm(shm_id);
return 0;
}
client.c:
#include <stdio.h>
#include "comm.h"
int main()
{
int _size = 1000;
int shm_id = get_shm(_size);
printf("sleep(5)\n");
sleep(5);
char* mem = (char*)attach(shm_id);
memset(mem,'\0',_size);
int index = 0;
//多进程往共享内存里面写数据,没有互斥访问共享内存,可以结合信号量机制互斥访问
int count = 60;
while(count--)
{//可以再起一个client进行写,增加挂接共享内存的数目,命令:ipcs -m查看挂接数目
mem[index] = 'X';
mem[index+1] = '\0';
index++;
sleep(1);
}
detach(mem);
printf("detach\n");
return 0;
}
运行结果:
(1)
(2)
(3)