头文件
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
结构体
共享内存管理结构体:
struct shmid_ds {
struct ipc_perm shm_perm;
int shm_segsz;
__kernel_time_t shm_atime;
__kernel_time_t shm_dtime;
__kernel_time_t shm_ctime;
__kernel_ipc_pid_t shm_cpid;
__kernel_ipc_pid_t shm_lpid;
unsigned short shm_nattch;
unsigned short shm_unused;
void *shm_unused2;
void *shm_unused3;
};
API
void *shmat(int shmid, const void *shmaddr, int shmflg);//shared memory attach operation
连接共享内存
参数:
shmid 共享内存标识符
shmaddr 共享内存地址
shmflg 共享内存标志
返回值:
正确 返回共享内存虚拟地址
错误 返回-1
补充说明:
如果shmaddr是空指针,共享地址由系统分配.
如果shmaddr非空且(shmflg &SHM_RND)非0,则共享地址为(shmaddr-((uintptr_t)shmaddr%SHMLBA)).
如果shmaddr非空且(shmflg &SHM_RND)为0,则共享地址为shmaddr.
当(shmflg &SHM_RDONLY)非0时共享内存段只读;
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_
int shmctl(int shmid, int cmd, struct shmid_ds *buf);//shared memory control operations
控制共享内存
参数:
shmid 共享内存标识符
cmd 控制命令
buf 共享内存管理结构体
返回值:
正确 返回0
错误 返回-1
补充说明:
IPC_STAT 获取shmid_ds信息
IPC_SET 设置shmid_ds信息
IPC_RMID 删除共享内存
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_
int shmdt(const void *shmaddr);//shared memory detach operation
删除共享内存
参数:
shmaddr 共享内存地址
返回值:
正确 返回0
错误 返回-1
补充说明:
^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_^_
int shmget(key_t key, size_t size, int shmflg);//get shared memory segment
创建/获取共享内存段
参数:
key 键值
size 共享内存大小
shmflg 标识
返回值:
正确 返回共享内存标识符
错误 返回-1
补充说明:
key为IPC_PRIVATE(0)则创建新的共享内存
若key不为IPC_PRIVATE但(shmflg &IPC_CREAT)非0,则创建新的共享内存
size为新建共享内存的大小,若是获取共享内存则设size为0
shmflg为0获取共享内存标识符
IPC_CREAT:当shmflg&IPC_CREAT为真时,如果内核中不存在键值与key相等的共享内存,则新建一个共享内存;如果存在这样的共享内存,返回此共享内存的标识符
IPC_CREAT|IPC_EXCL:如果内核中不存在键值与key相等的共享内存,则新建一个消息队列;如果存在这样的共享内存则报错
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
typedef struct shm{
int i;
char j;
}SHM;
int main(int argc,char **argv)
{
int shmid;
SHM *shm1;
shmid=shmget(123,sizeof(SHM),IPC_CREAT|0660);
if(shmid==-1)
perror("shmget()");
printf("shmid%d\n",shmid);
shm1=(SHM*)shmat(shmid,0,0);
if(shm1==(SHM*)(-1))
perror("shmat()\n");
while(1){
shm1->i+=1;
printf("w:%d\n",shm1->i);
sleep(1);
if(shm1->i>100)
break;
}
if(shmdt(shm1) == -1){
return -1;
}
if(shmctl(shmid,IPC_RMID,0) == -1){
return -1;
}
return 0;
}
读:
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <sys/ipc.h>
typedef struct shm{
int i;
char j;
}SHM;
int main(int argc,char **argv)
{
int shmid;
SHM *shm1;
shmid=shmget(123,sizeof(SHM),0);
if(shmid==-1)
perror("shmget()");
printf("shmid:%d\n",shmid);
shm1=(SHM*)shmat(shmid,0,0);
if(shm1==(SHM*)(-1))
perror("shmat()\n");
while(1){
printf("r:%d\n",shm1->i);
sleep(1);
if(shm1->i>100)
break;
}
if(shmdt(shm1) == -1){
return -1;
}
if(shmctl(shmid,IPC_RMID,0) == -1){
return -1;
}
return 0;
}