1、shmget(2)
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:创建一块共享内存区域的ID号
参数:
key :通过ftok()函数返回值获得
size:共享内存区块大小,单位:Byte
shmglf:一般用IPC_CREAT|0664。
返回值:
成功:id号
失败:-1
2、shmat(2)
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:获取一块共享内存区域
参数:
shmid:shmget()函数的返回值。
shmaddr:指定分配的内存地址,NULL表示由系统分配
shmflg:
RDONLY:只读
0:读写
返回值 :成功:分配的共享内存首地址
失败:(void *) -1
3、shmdt(2)
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
功能:分离映射关系。
参数:shmaddr:需要分离的共享内存首地址
返回值:成功:0
失败:-1
两个进程通过共享内存分享数据代码举例(写入者):
int main(void){
key_t key_id;
key_id = ftok(FILENAME,PROJ_ID);
int shm_id;
shm_id = shmget(key_id,1,IPC_CREAT|0664);
void *str_p = NULL;
str_p = shmat(shm_id,NULL,0);
printf("向共享内存写入数据\n");
strcpy((char *)str_p,"write a data test");
printf("写入内容:%s\n",(char *)str_p);
printf("执行(shmdt(str_p)\n");
shmdt(str_p);
printf("读取共享内存区域数据。\n");
printf("%s\n",(char*)str_p);
return 0;
}
两个进程通过共享内存分享数据代码举例(读取者):
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#define FILENAME ".."
#define PROJ_ID 3
int main(void){
key_t key_id;
key_id = ftok(FILENAME,PROJ_ID);
int shm_id;
shm_id = shmget(key_id,1,IPC_CREAT|0664);
void *str_p = NULL;
str_p = shmat(shm_id,NULL,RDONLY);
printf("读取共享内存数据:\n");
printf("%s\n",(char*)str_p);
printf("执行shmdt(str_p)\n");
shmdt(str_p);
printf("再次读取共享内存数据:\n");
printf("%s\n",(char*)str_p);
return 0;
}