文章目录

  • 共享内存概述
    • 共享内存的特点
  • 共享内存操作
    • 在ubuntu 12.04中共享内存限制值如下
    • 获得一个共享存储标识符
    • 创建共享内存
    • 共享内存映射(attach)
    • 解除共享内存映射(detach)
    • 共享内存控制

共享内存概述

共享内存允许两个或者多个进程共享给定的存储区域。

共享内存的特点

1、共享内存是进程间共享数据的一种最快的方法。一个进程向共享的内存区域写入
了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。
2、使用共享内存要注意的是多个进程之间对一个给定存储区访问的互斥。若一个进
程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读、写这
些数据。


总结:共享内存是进程间通信方式中效率最高的,原因在于进程是直接在物理内存上进行操作,将物理地址映射到用户进程这,所以只要对其地址进行操作,就是直接对物理地址操作。

共享内存操作

在ubuntu 12.04中共享内存限制值如下

1、共享存储区的最小字节数:1
2、共享存储区的最大字节数:32M
3、共享存储区的最大个数:4096
4、每个进程最多能映射的共享存储区的个数:4096

获得一个共享存储标识符


使用shell命令操作共享内存

查看共享内存
ipcs ‐m
删除共享内存
ipcrm ‐m shmid

创建共享内存

例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char const *argv[])
{//使用ftok函数获取键值key_t mykey;if((mykey = ftok(".", 100)) == -1){perror("fail to ftok");exit(1);}//通过shmget函数创建或者打开一个共享内存,返回一个共享内存的标识符int shmid;if((shmid = shmget(mykey, 500, IPC_CREAT | 0666)) == -1){perror("fail to shmget");exit(1);}printf("shmid = %d\n", shmid);system("ipcs -m");return 0;
};

共享内存映射(attach)

注意:shmat函数使用的时候第二个和第三个参数一般设为NULL和0,即系统自动指
定共享内存地址,并且共享内存可读可写。

解除共享内存映射(detach)


使用共享内存实现读写操作
write.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
typedef struct{int a;char b;
}MSG;
int main(int argc, char const *argv[])
{//使用ftok函数获取键值key_t mykey;if((mykey = ftok(".", 100)) == -1){perror("fail to ftok");exit(1);}//通过shmget函数创建或者打开一个共享内存,返回一个共享内存的标识符int shmid;if((shmid = shmget(mykey, 500, IPC_CREAT | 0666)) == -1){perror("fail to shmget");exit(1);}system("ipcs -m");//使用shmat函数映射共享内存的地址//char *text;MSG *text;if((text = shmat(shmid, NULL, 0)) == (void *)-1){perror("fail to shmat");exit(1);}//通过shmat的返回值对共享内存操作//strcpy(text, "hello world");text->a = 100;text->b = 'w';//操作完毕后要接触共享内存的映射if(shmdt(text) == -1){perror("fail to shmdt");exit(1);}system("ipcs -m");return 0;
}

read.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
typedef struct{int a;char b;
}MSG;
int main(int argc, char const *argv[])
{//使用ftok函数获取键值key_t mykey;if((mykey = ftok(".", 100)) == -1){perror("fail to ftok");exit(1);}//通过shmget函数创建或者打开一个共享内存,返回一个共享内存的标识符int shmid;if((shmid = shmget(mykey, 500, IPC_CREAT | 0666)) == -1){perror("fail to shmget");exit(1);}system("ipcs -m");//映射共享内存的地址//char *text;MSG *text;if((text = shmat(shmid, NULL, 0)) == (void *)-1){perror("fail to shmat");exit(1);}//获取共享内存中的数据//printf("text = %s\n", text);printf("a = %d, b = %c\n", text->a, text->b);//解除共享内存映射if(shmdt(text) == -1){perror("fail to shmdt");exit(1);}system("ipcs -m");return 0;
}

共享内存控制


例子

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/shm.h>
int main(int argc, char const *argv[])
{//使用ftok函数获取键值key_t mykey;if((mykey = ftok(".", 100)) == -1){perror("fail to ftok");exit(1);}//通过shmget函数创建或者打开一个共享内存,返回一个共享内存的标识符int shmid;if((shmid = shmget(mykey, 500, IPC_CREAT | 0666)) == -1){perror("fail to shmget");exit(1);}printf("shmid = %d\n", shmid);system("ipcs -m");//通过shmctl函数删除共享内存if(shmctl(shmid, IPC_RMID, NULL) == -1){perror("fail to shmctl");exit(1);}system("ipcs -m");return 0;
}

linux进程间通讯-共享内存相关推荐

  1. WIN32 进程间通讯-共享内存

    一.引言     在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效的进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换 ...

  2. Linux 进程间通讯(IPC)方式 ------- 共享内存

    Linux 进程间通讯(IPC)方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) ...

  3. Linux 进程间通讯方式 pipe()函数

    Linux 进程间通讯方式有以下几种: 1->管道(pipe)和有名管道(fifo). 2->消息队列 3->共享内存 4->信号量 5->信号(signal) 6-&g ...

  4. linux无名管道实验代码,Linux 进程间通讯之创建无名管道和读写无名管道

    Linux进程间通讯的方式: 1. 管道(pipe)和有名管道(FIFO). 2. 信号(signal) 3. 消息队列 4. 共享内存 5. 信号量 6. 套接字(socket) 管道通讯: 无名管 ...

  5. linux进程间通讯的几种方式的特点和优缺点,和适用场合。

    http://blog.csdn.net/kakaka2011/article/details/6636661 1. 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有 ...

  6. linux命名管道进程间通信,Linux进程间通讯--命名管道

    IPC安全 前面总结了匿名管道,如今来看命名管道:因为匿名管道的一个限制就是:只能是有血缘关系的进程间才能够通讯,好比:有两个同祖先的子进程,父子进程等:为了突破这一个限制,想让没有任何关系的两个进程 ...

  7. Linux 进程间通讯详解一

    进程间的通讯 两台主机间的进程通讯 --socket一台主机间的进程通讯 --管道(匿名管道,有名管道) --System V进程间通信(IPC)包括System V消息队列,System V信号量, ...

  8. linux进程间通讯-信号

    文章目录 进程间通信功能 信号 信号的概念 产生信号的方式 信号的默认(缺省)处理方式 进程接收到信号后的处理方式 kill函数 alarm函数 raise函数 abort函数 pause函数 sig ...

  9. Linux进程间通讯

    最初Unix IPC包括:管道.FIFO.信号: System V IPC包括:System V消息队列.System V信号灯.System V共享内存区: Posix IPC包括: Posix消息 ...

最新文章

  1. 第5章 案例研究: QuickCheck
  2. Ubuntu下firefox启动问题
  3. MyBatisPlus中使用 @TableField完成字段自动填充
  4. 寻找道路(codevs 3731)题解
  5. Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊...
  6. sklearn自学指南(part25)--正交分解
  7. hive kerberos java_Kerberos身份验证错误 - Sqoop通过Hive从SQL导入HDFS
  8. Android仿微信界面
  9. Linux7/Redhat7/Centos7 安装Oracle 12C_监听配置及DBCA安装数据库_05
  10. c语言提示错误信息,【资料】C语言错误信息中文解释
  11. mysql 表迁移 并筛选_使用perl实现拆分数据表(mysql)并迁移数据实例
  12. 黑苹果OC引导注入_黑苹果OC配置工具:OpenCore Configurator v2.15.2.0
  13. STL格式抽壳补孔洞破面修复等,Magics视频教程
  14. 自考c语言程序设计02600,自考02600《C语言程序设计》模拟试卷十一
  15. 停车场管理系统 课程设计 C语言
  16. 楼板计算塑形弹性_土木吧丨弹性与弹塑性计算差异性分析
  17. Android 监听wifi热点打开和关闭广播
  18. python代码示例大全 下载-python基础代码大全
  19. 采集资源结束后,图片不显示解决办法
  20. Java类(无参、有参构造方法、静态变量)

热门文章

  1. 全景分割 | Learning to Fuse Things and Stuff
  2. TypeError: Caught TypeError in DataLoader worker process 0.
  3. java-web分层2-Bean和业务层
  4. LeetCode 685. 冗余连接 II
  5. OpenCV学习笔记2---命名规约
  6. python递归题目_Python递归的问题?
  7. 腾讯云“抢救”微盟!开 766 次在线会议、调拨 100 多台服务器、闹钟只敢定 2 小时...
  8. The Innovation | Volume 2 Issue3 正式出版
  9. 土壤学报:张福锁院士等提出根际生命共同体新概念
  10. Sciences:用膳食纤维钓出15株缓解糖尿病的细菌!