您的位置:首页 > 运维架构 > Linux

linux中的共享内存实现进程间通信

2018-04-02 14:59 901 查看

一、linux中进程间通信的实现方法

《1》管道

(1)匿名管道(无名管道):实现有关系的进程间的通信

(2)命名管道(有名管道):任意两进程间通信

详情见:

https://blog.csdn.net/dai_wen/article/details/79777984

《2》共享内存

在内存中开辟一段共享内存空间,共不同进程间访问;

二、共享内存实现进程间通信

《1》创建共享内存:

int shmget(key_t key ,size_t size,int shm_flg);
//key_t key:共享内存标识号,可以写为IPC_PRIVATE,代表让系统分配一个本地的IPC值
//size_t size:共享内存的大小
//int shm_flg:给共享内存的权限(3位八进制)


//创建共享内存
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int arg, char* args[])
{
int shmid = shmget(IPC_PRIVATE, 1024, 0666 );//在内存中创建共享内存
if(shmid < 0)
{
printf("error\n");
}
else
{
printf("success\n");
}
return 0;
}




注意:这里出现了一个新的命令,ipcs -m,显示已经成功创建的共享内存

可以看出已经成功创建一个共享内存,其shmid为819219;共享它的进程数nattch为0

《2》附加共享内存区

void* shmat(int shmid,const* shmaddr,int shmflg)
//int shmid:已经成功创建的shmid的标识号
//const* shmaddr: 创建附加共享内存区的地址,一般为0,代表操作系统开辟一段空间
//int shmflg,一般为0,代表可读可写


《3》释放附加共享内存地址

int shmdt(const void* shmaddr)
//const void* shmaddr: 附加空间的地址


//附加上共享内存段
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int arg, char* args[])
{
char*shmbuf;
int shmid = 0;
if(arg > 1)
{
shmid = atoi(args[1]);
shmbuf = shmat(shmid, 0, 0);
sleep(60);
shmdt(shmbuf);
}
return 0;
}




《4》共享内存读写的例子

//共享内存读写
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int arg, char* args[])
{
char* shmbuf;
int shmid = 0;
if(arg> 2)
{
shmid = atoi(args[1]);//通过参数得到共享内存ID号
shmbuf = shmat(shmid ,0, 0);//将附加内存加到该共享内存
if(atoi(args[2]) == 1)//设置1为写
{
scanf("%s",shmbuf);
}
if(atoi(args[2]) ==2 )//2为读
{
printf("%s\n",shmbuf);
}
shmdt(shmbuf);//释放本地地址
}
return 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: