0
点赞
收藏
分享

微信扫一扫

【Linux】共享内存

彩虹_bd07 2022-03-25 阅读 72
c语言linux

共享内存是一种最为高效的进程间通信方式。因为进程可以直接读写内存,不需要任何数据复制。

共享内存的实现分为两个步骤:

1、创建共享内存——shmget(),也就是从内存中获得一段共享内存区域。

2、映射共享内存——shmat(),取消映射操作shmdt()。

shmget()

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
key_t key = ftok(".", '!');
if(key < 0)
{
perror("ftok");
}

//int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
int shmid = shmget(key, 512, 0664|IPC_CREAT);
if(shmid < 0)
{
perror("shmget");
exit(-1);
}
printf("shmid = %d\n", shmid);

return 0;
}

 shmat()

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
key_t key = ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
if(key < 0)
{
perror("ftok");
}

//int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
int shmid = shmget(key, 512, 0664|IPC_CREAT); //创建或者打开共享内存
if(shmid < 0)
{
perror("shmget");
exit(-1);
}
printf("shmid = %d\n", shmid);

void *addr = shmat(shmid, NULL, 0); //内存映射 映射的地址由系统自动分配 该地址可读可写
if(addr == (void*)-1)
{
printf("shmat");
exit(-1);
}

printf("addr = %p\n", addr);
return 0;
}

shmdt()

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
key_t key = ftok(".", '!'); //通过ftok函数得到创建或者打开共享内存的key值
if(key < 0)
{
perror("ftok");
}

//int shmid = shmget(IPC_PRIVATE, 512, 0664|IPC_CREAT);
int shmid = shmget(key, 512, 0664|IPC_CREAT); //创建或者打开共享内存
if(shmid < 0)
{
perror("shmget");
exit(-1);
}
printf("shmid = %d\n", shmid);

void *addr = shmat(shmid, NULL, 0); //内存映射 映射的地址由系统自动分配 该地址可读可写
if(addr == (void*)-1)
{
printf("shmat");
exit(-1);
}

printf("addr = %p\n", addr);

int ret = shmdt(addr);
if(ret < 0)
{
perror("shmdt");
exit(-1);
}
return 0;
}

 

 

举报

相关推荐

0 条评论