欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 进程间的通信4 共享内存

进程间的通信4 共享内存

2024/10/25 4:24:05 来源:https://blog.csdn.net/m0_54244065/article/details/142431174  浏览:    关键词:进程间的通信4 共享内存

共享内存

1.共享内存简介

  • 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中,减少数据在内核空间缓存
  • 共享内存是一种效率较高的进程间通讯的方式
  • 在 Linux 系统中通过 ipcs -m 查看所有的共享内存
    在这里插入图片描述
  • 共享内存模型图
    在这里插入图片描述

2.共享内存的创建

1.函数头文件
#include<sys/ipc.h>
#include<sys/shm.h>
2.函数原型
intshmget(key_tkey,size_tsize,intshmflg);
3.函数功能
创建一个共享内存,并返回ID
4/函数参数key:ftok()函数返回size:共享内存的大小shmflg:共享内存标志
5.函数返回值
成功:返回共享内存id
失败:返回-1,并设置errno

3.共享内存的删除

1.函数头文件
#include<sys/ipc.h>
#include<sys/shm.h>
2.函数原型
int shmctl(int shmid,int cmd,struct shmid_ds*buf);
3.函数功能
共享内存控制函数,功能由具体的功能命令字决定
4.函数参数shmid:共享内存id cmd:控制命令字IPC_STAT:获取消息队列属性IPC_SET:设置消息队列属性I	PC_RMID:删除消息队列属性,用此命名时,第三个参数为NULL buf:共享内存属性结构体指针
5.函数返回值
成功:返回0,特殊命令字除外
失败:返回-1

4.共享内存映射

1.函数头文件
#include<sys/types.h>
#include<sys/shm.h>
2.函数原型
void*shmat(int shmid,const void*shmaddr,int shmflg);
3.函数功能
将进程地址空间映射到共享内存上
4.函数参数
shmid:共享内存id
shmaddr:指定映射到进程地址空间的起始地址,指定为NULL,由系统选择映射的地址shmflg:共享内存标志,一般设置为0
5.函数返回值
成功:返回映射到进程地址空间的起始地址
失败:(void*)-1,并设置errno

5.共享内存解除映射

1.函数头文件
#include<sys/types.h>
#include<sys/shm.h>
2.函数原型
intshmdt(constvoid*shmaddr);
3.函数功能
解除进程地址空间与共享内存的映射
4.函数参数
shmaddr:映射地址空间的起始地址
5.函数返回值
成功:返回0
失败:返回-1,并设置errno

6.测试案列(在文件输出内容):

share_write.c:

#include <sys/types.h>
#include <sys/ipc.h>
#include <string.h> 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/shm.h>
#define PATH "/home/linuxfu"
#define SIZE 1024
int main(){key_t key = ftok(PATH,70);if(key == -1){perror("key");exit(EXIT_FAILURE);}//设置共享内存 int shmid = shmget(key,SIZE,0666 | IPC_CREAT);if(shmid == -1){perror("shmid");exit(EXIT_FAILURE);} //挂接共享内粗void * share_add = shmat(shmid,NULL,0);if(share_add == (void*)-1){perror("share_add");exit(EXIT_FAILURE);}char buf[SIZE] = { 0 };fgets(buf,sizeof(buf) - 1,stdin);buf[strlen(buf) - 1]  = '\0'; strcpy((char*)share_add,buf); //挂断shmdt(share_add); 
}

share_read.c:

#include <sys/types.h>
#include <sys/ipc.h>
#include <string.h> 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <sys/shm.h>
#define PATH "/home/linuxfu"
#define FILENAME "log.txt"
#define SIZE 1024
int main(){key_t key = ftok(PATH,70);if(key == -1){perror("key");exit(EXIT_FAILURE);}//设置共享内存 int shmid = shmget(key,SIZE,0666 | IPC_CREAT);if(shmid == -1){perror("shmid");exit(EXIT_FAILURE);} //挂接共享内粗void * share_add = shmat(shmid,NULL,0);if(share_add == (void*)-1){perror("share_add");exit(EXIT_FAILURE);}FILE * pf = fopen(FILENAME,"w+");if(pf == NULL){perror("pf");exit(EXIT_FAILURE);}	fputs((char*)share_add,pf);shmdt(share_add); shmctl(shmid,IPC_RMID,NULL);
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com