SystemV内存共享
创建共享内存
/**
输入:
key_t key 标识符的规则
size_t size 共享内存大小
int shmflg 读写权限
输出: 成功返回共享内存标识符Id
失败 -1
说明:
IPC_CREAT 若共享内存不存在,则创建;若存在,则打开
IPC_CREAT | IPC_EXCL 若共享内存不存在,则创建,若存在,则报错
个别Linux系统(Ubuntu)需要加上0666参数进行校验,才能获取共享内存空间中的值
#define PERM S_IRUSR | S_IWUSR | IPC_CREAT
*/
int shmget(key_t key, size_t size, int shmflg);
连接共享内存
/**
输入:
int shmid 共享存储id
voidr* addr 一般为0
int flag 一般为0
输出: 成功 – 共享存储段地址
失败 -- -1
说明:
*/
void shmat(int shmid, voidr addr, int flag);
删除共享存储段地址
int shmdt(void* addr);
控制共享内存
/**
输入:
int shmid 共享存储id
int cmd 控制命令
struct shmid_ds *buf
输出:
说明:
控制命令:IPC_RMID
IPC_STAT
SHM_LOCK
SHM_UNLOCK
*/
int shmctl(int shmid, int cmd,struct shmid_ds *buf);
注意:
创建或打开共享内存错误原因,errno储存错误原因。
EINVAL 参数size小于SHMMIN或大于SHMMAX。
EEXIST 预建立key所致的共享内存,但已经存在。
EIDRM 参数key所致的共享内存已经删除。
ENOSPC 超过了系统允许建立的共享内存的最大值(SHMALL )。
ENOENT 参数key所指的共享内存不存在,参数shmflg也未设IPC_CREAT位。
EACCES 没有权限。
ENOMEM 核心内存不足。
#include <semaphore.h>
#inlcude <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <ipc.h>
#include <sys/shm.h>
#include <fcntl.h>
sem_t *semid;
int main(int argc, char** argv)
{
const char* semName = "sem_name_run";
semid = sem_open(semName,O_CREAT,0644,0);
if(semid == SEM_FAILED)
{
perror("unable to create semaphore");
unlink(semName);
exit(-1);
}
if(fork() == 0)
{
int shmid = shmget(0x123,1024,IPC_CREAT|0666);
char* data;
if(shmid <0)
{
perror("shmget failed");
exit(-1);
}
data = (char*)shmat(shmid,0,0);
sprintf(data,"%s","xxx");
sem_post(semid);
}
sem_wait(semid);
int shmid;
shmid = shmget(0x123,1024,IPC_CREAT|0666);
char* data;
data = shmat(0x123,0,0);
printf("data: %s",data);
sem_close(semid);
sem_unlink(semName);
return 0;
}