大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
1.什么是共享内存?
2.与共享内存有关的数据结构
3.与共享内存有关的函数
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
3.1创建共享内存——>shmget() 函数
int shmget(key_t key, size_t size, int shmflg);
//成功返回共享内存的ID,出错返回-1
int shmctl(int shm_id, int cmd, struct shmid_ds *buf);
//成功返回0,出错返回-1
struct shmid_ds
{
uid_t shm_perm.uid;
uid_t shm_perm.gid;
mode_t shm_perm.mode;
};
3.3挂接操作———>shmat()函数
void *shmat(int shm_id, const void *shm_addr, int shmflg);
//成功返回指向共享存储段的指针,出错返回-1
(1)第一个参数,shm_id是由shmget函数返回的共享内存标识。
(2)第二个参数,shm_addr指定共享内存连接到当前进程中的地址位置,通常为空,表示让系统来选择共享内存的地址。
(3)第三个参数,shm_flg是一组标志位,通常为0
3.4分离操作———>shmdt()函数
int shmdt(const void *shmaddr); //成功返回0,出错返回-1
4.模拟实现进程间的通信方式———>共享内存
Server作为发送方,每次向共享内存中,写入A,Client作为接收方,每次读取共享内存中的数据
comm.h
#ifndef __COMM_H__
#define __COMM_H__
#include <stdio.h>
#include <error.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PATHNAME "."
#define PROJ_ID 066
int CreatShmid(int size);
int GetShmid(int size);
int Destory(int shmid);
#endif
comm.c
#include "comm.h"
static int commShmid(int size,int flag)
{
key_t key=ftok(PATHNAME,PROJ_ID);
if(key>0)
{
return shmget(key,size,flag);
}
else
{
perror("ftok");
return -1;
}
}
int CreatShmid(int size)
{
return commShmid(size,IPC_CREAT|IPC_EXCL|0666);
}
int GetShmid(int size)
{
return commShmid(size,IPC_CREAT);
}
int Destory(int shmid)
{
return shmctl(shmid,0,IPC_RMID);
}
server.c
#include "comm.h"
int main()
{
int shmid=CreatShmid(4097);
if(shmid>0)
{
int i=0;
char *addr=shmat(shmid,NULL,0);
while(i<20)
{
addr[i++]='A';
addr[i]='\0';
sleep(1);
}
if(shmdt(addr)==-1)
{
perror("shmat");
return -3;
}
}
else
{
perror("CreatShmid");
return -1;
}
if(Destory(shmid)<0)
{
perror("Destory");
return -2;
}
return 0;
}
client.c
#include "comm.h"
int main()
{
int shmid=GetShmid(4097);
if(shmid>0)
{
int i=0;
char *addr=shmat(shmid,NULL,0);
while(i<20)
{
printf("%s\n",addr);
sleep(1);
i++;
}
if(shmdt(addr)==-1)
{
perror("shmdt");
return-1;
}
}
else
{
perror("GetShmid");
return -2;
}
return 0;
}
通过查看共享内存状态可以知道操作系统提供给用户的共享内存为4097个字节,实际上操作系统开辟了8K个字节,而且由于接收方client还没挂接,所以挂接数为1。
运行结果分析:
共享内存中的数据并不会像管道或者信号量等被一端读取之后就不存在。
5.使用共享内存的优缺点
优点:我们可以看到使用共享内存进行进程间的通信真的是非常方便,而且函数的接口也简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,也加快了程序的效率。同时,它也不像匿名管道那样要求通信的进程有一定的父子关系(system V版本共有)。
缺点:共享内存没有提供互斥同步的机制,这使得我们在使用共享内存进行进程间通信时,往往要借助其他的手段比如信号量等来进行进程间的同步工作。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/183818.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...