进程间通信->共享内存

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;
}

在这里插入图片描述

以上是关于进程间通信->共享内存的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信

操作系统实验3共享内存进程间通信实验

linux进程间通信之Posix共享内存用法详解及代码举例

进程间通信之共享内存

进程间通信

进程间通信