1. 创建共享内存
int shmid =shmget((key_t) key ,size_t size, int flag);
//key表示当前共享内存的key,单独表示共享内存的id
//size表示要开辟的共享内存大小
//flag表示权限,跟mode一样,如果不存在要与IPC_CREAT做或操作,
//返回共享内存的id
2. 连接当前进程
单独的创建出共享内存没有用,要与当前进程进行连接
void *shmat(int shm_id, const void *shm_addr, int shmflg);
//shm_id表示想要连接的共享内存id
//shm_addr表示想要共享共享内存连接的地址,为0,表示系统自动选择
//shmflg标志位,通常为0
3. 共享内存分离进程
int shmdt(const void *shmaddr);
//shmaddr 则是共享内存的地址
4. 控制共享内存函数
int shmctl(int shm_id, int command, struct shmid_ds *buf);
//shm_id 为共享内存id
//command : IPC_RMID 删除共享内存
// : IPC_SET 把共享内存的当前关联值设置为shmid_ds结构中给出的值
// : IPC_STAT 把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值
5. 代码示例
数据结构
#define TEXT_SZ 2048
struct shared_use_st
{
int written;//作为一个标志,非0:表示可读,0表示可写
char text[TEXT_SZ];//记录写入和读取的文本
};
写代码逻辑
#include<stdio.h>
#include<sys/shm.h>
#include<unistd.h>
#include"sharedata.h"
int main()
{
struct shared_use_st *shared;
int shmid;
void *shm;
shmid =shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid == -1)
{
return -1;
}
shm = shmat(shmid,0,0);
if(shm == (void *) -1)
{
return -1;
}
shared = (struct shared_use_st *) shm;
shared->written = 0;
while(1)
{
if(shared->written == 0)
{
printf("please write :\n");
scanf(" %s" , shared->text);
shared->written = 1 ;
}
else
{
sleep(1);
}
}
if(shmdt(shared)==-1)
{
return -1;
}
return 0;
}
读代码逻辑
int main()
{
struct shared_use_st *shared;
int shmid;
void *shm;
shmid =shmget((key_t)1234,sizeof(struct shared_use_st),0666|IPC_CREAT);
if(shmid == -1)
{
return -1;
}
shm = shmat(shmid,0,0);
if(shm == (void *) -1)
{
return -1;
}
shared = (struct shared_use_st *) shm;
shared->written = 0;
while(1)
{
if(shared->written)
{
printf("you wrote : %s\n", shared->text);
sleep(10);
shared->written = 0 ;
if(strncmp(shared->text,"end",3) == 0)
{
break;
}
}
else
{
sleep(1);
}
}
if(shmdt(shared)==-1)
{
return -1;
}
if(shmctl(shmid, IPC_RMID, 0) == -1)
{
return 0;
}
return 0;
}