进程间通信->共享内存
Posted studying~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程间通信->共享内存相关的知识,希望对你有一定的参考价值。
优秀博文:https://blog.csdn.net/ypt523/article/details/79958188?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162170459616780262543904%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=162170459616780262543904&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-79958188.pc_search_result_cache&utm_term=%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1%E5%85%B1%E4%BA%AB%E5%86%85%E5%AD%98%E5%85%A8%E5%8F%8C%E5%B7%A5&spm=1018.2226.3001.4187
共享内存:两个或多个进程共享一个给定的存储区。
1、特点
1).共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
2).因为多个进程可以同时操作,所以需要进行同步。
3).信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。
2、原型
1 #include <sys/shm.h>
2 // 创建或获取一个共享内存:成功返回共享内存ID,失败返回-1并设置错误码
3 int shmget(key_t key, size_t size, int flag);
4 // 连接共享内存到当前进程的地址空间:成功返回指向共享内存的指针,失败返回-1
5 void *shmat(int shm_id, const void *addr, int flag);
6 // 断开与共享内存的连接:成功返回0,失败返回-1
7 int shmdt(void *addr);
8 // 控制共享内存的相关信息:成功返回0,失败返回-1
9 int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
参数:
shmget
key:索引值,由ftok生成,双方通过同个key找到同个地址空间进行数据交互
size:需要申请共享内存的大小,一般申请的内存大小为页的整数倍,一页是4k字节
flag:如果要创建新的共享内存,需要使用IPC_CREAT,如果是获取共享内存,可以直接写0
shmat
shm_id:共享内存标识符
addr:写0,则存储段连接到由内核选择的第一个可以地址上(推荐使用)
flag:访问共享内存的权限,写0支持读写
shmdt
addr:shmat的返回值
shmctl
cmd:IPC_RMID(从系统中删除该共享内存)
buf:设为NULL
3、例子
write.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
int main()
{
key_t key = ftok(".",1);
int shmid = shmget(key,4*1024,IPC_CREAT|0666);
if(shmid == -1)
{
printf("create shm fail\\n");
exit(-1);
}
char *shmaddr = shmat(shmid,0,0);
strcpy(shmaddr,"chenhongming");
printf("copy success!\\n");
sleep(5);
shmdt(shmaddr);
shmctl(shmid,IPC_RMID,NULL);
return 0;
}
read.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/types.h>
#include <string.h>
#include <unistd.h>
int main()
{
key_t key = ftok(".",1);
int shmid = shmget(key,4*1024,0);
if(shmid == -1)
{
printf("open shm fail\\n");
exit(-1);
}
char * shmaddr = shmat(shmid,0,0);
printf("shmaddr = %s\\n",shmaddr);
shmdt(shmaddr);
return 0;
}
以上是关于进程间通信->共享内存的主要内容,如果未能解决你的问题,请参考以下文章