共享内存
共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

共享内存实现分为两个步骤:
一、创建共享内存,使用shmget函数。
二、映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数。

系统调用:shmget( ) ;
原型:int shmget ( key_t key, int size, int shmflg );
返回值:如果成功,返回共享内存段标识符。
如果失败,则返回- 1:
errno = EINVAL (无效的内存段大小)
EEXIST (内存段已经存在,无法创建)
EIDRM (内存段已经被删除)
ENOENT (内存段不存在)
EACCES (权限不够)
ENOMEM (没有足够的内存来创建内存段)

系统调用:shmat();
原型:int shmat ( int shmid, char *shmaddr, int shmflg);
返回值:如果成功,则返回共享内存段连接到进程中的地址。
如果失败,则返回- 1:
errno = EINVAL (无效的IPC ID 值或者无效的地址)
ENOMEM (没有足够的内存)
EACCES (存取权限不够)

当一个进程不在需要共享的内存段时,它将会把内存段从其地址空间中脱离。
系统调用:shmdt();
调用原型:int shmdt ( char *shmaddr );
返回值:如果失败,则返回- 1:
errno = EINVAL (无效的连接地址)

使用共享内存和使用malloc来分配内存区域很相似。使用共享内存的方法是:
1. 对一个进程/线程使用shmget分配内存区域。
2. 使用shmat放置一个或多个进程/线程在共享内存中,你也可以用shmctl来获取信息或者控制共享区域。
3. 使用shmdt从共享区域中分离。
4. 使用shmctl解除分配空间

信号量

#include <sys/sem.h>int semget(key_t key,int nsems, int flag);Returns:semaphore ID if OK,-1 on error.

#include <sys/sem.h>int semctl(int semid,int semnum,int cmd, ... /* union semun arg */);Returns:(see following).

#include <sys/sem.h>int semop(int semid,struct sembuf semoparray [],size_t nops);Return: 0 if OK,-1 on error.

转载于:https://www.cnblogs.com/yanghaishu/archive/2012/05/28/2522458.html

进程间通信(三)共享内存和信号量相关推荐

  1. Linux(信号,进程间通信)共享内存,信号量,消息队列

    信号(signal) 1.1 什么是信号? 信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式 1.2 信号的来源 硬件 [1] 用户在终端按下某些键时,终端驱动程序会发送信号给前台进程 ct ...

  2. 共享内存和信号量实现进程间通信

    文章目录 共享内存和信号量实现进程间通信 题目 思路 一.写程序 二.读程序 三.运行结果 总结 共享内存和信号量实现进程间通信 题目 通过共享内存和信号量实现进程间通信,其中A进程读入指定路径的文件 ...

  3. 进程间通信之分别用共享内存和信号量实现卖票

    利用共享内存实现的卖票系统: 利用flag来保证同一时间只有一个程序使用内存,使用结束还原. #include <stdio.h> #include <sys/ipc.h> # ...

  4. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  5. php多进程共享数据库,PHP多进程环境下通过共享内存与信号量实现资源共享

    PHP多进程环境下通过共享内存与信号量实现资源共享 目前工作环境,由于一些原因,不能使用swoole,和其他多进程的管理组件.但是项目中有大量的功能必须通过多进程来实现.面对这也不能,那也不能的困境, ...

  6. Linux进程间通信:共享内存(shm)

    目录 ★ key值说明 ★ shmget函数 ★ shmat函数 ★ shmdt函数 ★ shmctl函数 ★ 操作说明 ★ IPC相关指令 简介:共享内存指 (shared memory)在多处理器 ...

  7. 进程间通信之共享内存SHM

    文章目录 1. system-v IPC简介 2. 函数ftok()函数介绍 3. 共享内存SHM介绍 4. 共享内存SHM相关接口函数 5. 共享内存SHM代码示例 1. system-v IPC简 ...

  8. [转]Linux 进程间通信:共享内存

    (上) 级别: 初级 郑彦兴 (mlinux@163.com), 国防科大攻读博士学位 2003 年 5 月 01 日 共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式.两个不同进程A.B ...

  9. Linux进程间通信——使用共享内存

    下面将讲解进程间通信的另一种方式,使用共享内存. 一.什么是共享内存 顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式 ...

  10. 进程间通信:共享内存概念及代码

    前言 接下讨论的IPC机制,它们最初由System V版本的Unix引入.由于这些机制都出现在同一个版本中并且有着相似的编程接口,所以它们被称为System V IPC机制.接下来的内容包括: 信号量 ...

最新文章

  1. 2020年Q1微信公众号文章列表
  2. 事件冒泡和捕获的执行顺序
  3. 一个讲解WiFi和蓝牙协议的视频课程网站
  4. 豆瓣评分9分+,每一部看完不禁感慨!这里是神州大地!
  5. php调用webservice报错Class 'SoapClient' not found
  6. linux 显卡驱动程序,NVIDIA为Linux发布重大驱动程序升级
  7. mysql有状态无状态_有状态和无状态的对象区别
  8. android开发用logcat跟踪错误
  9. pytorch冻结模型
  10. 有MIMIC数据却不知道从何开始?从DIAGNOSES_ICD表开始(五)
  11. 【虚拟化数据恢复】KVM虚拟机误删除数据恢复案例
  12. ctf:xls加密_加密:爱丽丝和鲍勃的故事
  13. 学校宿舍天翼校园网构建路由器
  14. ofd格式转pdf,所需代码和jar包--亲测可用
  15. Sentinel2 哨兵2数据下载方法
  16. FST构图可视化详解
  17. 曲线图chart.js插件例子
  18. 移植WebRTC中的VAD
  19. 开利宣布收购空调企业广东积微集团,包括志高暖通等多家子公司
  20. 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对

热门文章

  1. U-Boot在FL2440上移植(四)----支持网卡DM9000和烧写yaffs文件系统
  2. oracle列表分区ADD VALUES或DROP VALUES包含数据变化
  3. 专家答疑:揭开虚拟化的迷雾
  4. 线程安全之CAS机制详解(分析详细,通俗易懂)
  5. plsql 存储过程 批量提交_浅谈PetShop之使用存储过程与PLSQL批量处理(附案例)
  6. ZMQ源码阅读 ---- zmq创建线程的过程
  7. 单片机控制电机原理以及程序怎么写
  8. 在计算机系统软件中核心软件,在计算机系统软件中的核心软件是()
  9. Struts2之Action的基本配置
  10. 【渝粤教育】国家开放大学2018年秋季 0550-22T素描(一) 参考试题