文章目录

  • 共享内存
  • 信号
  • 管道
  • 消息队列
通信方法 无法介于内核态与用户态的原因
管道(不包括命名管道) 局限于父子进程间的通信。
消息队列 在硬、软中断中无法无阻塞地接收数据。
信号量 无法介于内核态和用户态使用。
共享内存 需要信号量辅助,而信号量又无法使用。

共享内存

共享内存是最快的进程间通讯的方式

  • 原因:相对于其他几种方式,共享内存直接在进程的虚拟地址空间进行操作,不再通过执行进入内核的系统调用来传递彼此的数据

  • shmget函数

功能 用来创建共享内存
原型 int shmget(key_t key, size_t size, int shmflg);
参数key: 这个共享内存段名字
size: 共享内存大小
shmflg: 由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值: 成功返回⼀一个⾮非负整数,即该共享内存段的标识码;失败返回-1
  • shmat函数
功能: 将共享内存段连接到进程地址空间
原型 void *shmat(int shmid, const void *shmaddr, int shmflg);
参数shmid: 共享内存标识
shmaddr: 指定连接的地址
shmflg: 它的两个可能取值是SHM_RND和SHM_RDONLY
返回值: 成功返回⼀一个指针,指向共享内存第⼀一个节;失败返回-1
  • shmctl函数
功能: ⽤用于控制共享内存
原型 int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数shmid: 由shmget返回的共享内存标识码
cmd: 将要采取的动作(有三个可取值)
buf: 指向⼀一个保存着共享内存的模式状态和访问权限的数据结构
返回值: 成功返回0;失败返回-1
  • shmdt函数
功能: 将共享内存段与当前进程脱离
原型 int shmdt(const void *shmaddr);
参数shmaddr: 由shmat所返回的指针
返回值: 成功返回0;失败返回-1
注意: 将共享内存段与当前进程脱离不等于删除共享内存段
#include<stdio.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<errno.h>typedef struct _Teacher
{char name[64];int age;
}Teacher;int main(int argc, char *argv[])
{int ret = 0;int    shmid;//创建共享内存 ,相当于打开文件,文件不存在则创建shmid = shmget(0x2234, sizeof(Teacher), IPC_CREAT | 0666); if (shmid == -1){perror("shmget err");return errno;}printf("shmid:%d \n", shmid);Teacher *p = NULL;//将共享内存段连接到进程地址空间p = shmat(shmid, NULL, 0);//第二个参数shmaddr为NULL,核心自动选择一个地址if (p == (void *)-1 ){perror("shmget err");return errno;}strcpy(p->name, "aaaa");p->age = 33;//将共享内存段与当前进程脱离shmdt(p);printf("键入1 删除共享内存,其他不删除\n");int num;scanf("%d", &num);if (num == 1){//用于控制共享内存ret = shmctl(shmid, IPC_RMID, NULL);//IPC_RMID为删除内存段if (ret < 0){perror("rmerrr\n");}}                 return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include<string.h>
#include<errno.h>typedef struct _Teacher
{char name[64];int age;
}Teacher;int main(int argc, char *argv[])
{int ret = 0;int    shmid;//shmid = shmget(0x2234, sizeof(Teacher), IPC_CREAT |IPC_EXCL | 0666); //打开获取共享内存shmid = shmget(0x2234, 0, 0); if (shmid == -1){perror("shmget err");return errno;}printf("shmid:%d \n", shmid);Teacher *p = NULL;//将共享内存段连接到进程地址空间p = shmat(shmid, NULL, 0);if (p == (void *)-1 ){perror("shmget err");return errno;}printf("name:%s\n", p->name);printf("age:%d \n", p->age);//将共享内存段与当前进程脱离shmdt(p);printf("键入1 程序暂停,其他退出\n");int num;scanf("%d", &num);if (num == 1){pause();}                return 0;
}

选取简单的代码,可运行观察效果

信号

信号量和以前的IPC通信方式不同,信号量的本质是计数器,用于多进程对共享数据对象的访问。

在进程访问临界资源之前,需要测试信号量,如果为正数,则信号量-1并且进程可以进入临界区,若为非正数,则进程挂起放入等待队列,直至有进程退出临界区,释放资源并+1信号量,此时唤醒等待队列的进程。

信号量本身就是临界资源,所以必须是原子操作。

  • 生产者消费者模型:
    https://blog.csdn.net/csdn_kou/article/details/81240666

管道

单向,一端输入,另一端输出,先进先出FIFO。管道也是文件。管道大小4096字节。

  • 特点:管道满时,写阻塞;空时,读阻塞。
  • 分类:普通管道(仅父子进程间通信)位于内存;命名管道位于文件系统,没有亲缘关系管道只要知道管道名也可以通讯。
  • 管道是由内核管理的一个缓冲区(buffer),相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失
  • 匿名管道与命名管道的区别
    • 匿名管道由pipe函数创建并打开。
    • 命名管道由mkfifo函数创建,打开用open
    • FIFO(命名管道)与pipe(匿名管道)之间唯一的区别在它们创建与打开的方式不同,一但这些工作完成之后,它们具有相同的语义。

消息队列

消息队列是先进先出FIFO原则
ipcs & ipcrm命令

  • ipcs: 显示IPC资源
  • ipcrm: 手动删除IPC资源

进程间通讯的四种方式相关推荐

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

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

  2. 操作系统:进程间通讯的七种方式

    一.常见的通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式 ...

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

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

  4. ios页面间传递参数四种方式

    ios页面间传递参数四种方式 1.使用SharedApplication,定义一个变量来传递. 2.使用文件,或者NSUserdefault来传递 3.通过一个单例的class来传递 4.通过Dele ...

  5. 实现Web端即时通讯的四种方式

    Web端即时通讯技术:即时通讯技术简单的说就是实现这样一种功能:服务器端可以即时地将数据的更新或变化反应到客户端,例如消息即时推送等功能都是通过这种技术实现的.但是在Web中,由于浏览器的限制,实现即 ...

  6. Electron主进程渲染进程间通信的四种方式

    在electron中进程使用 ipcMain 和 ipcRenderer 模块,通过开发人员定义的"通道"传递消息来进行通信.新的版本中electron推荐使用上下文隔离渲染器进程 ...

  7. java线程间通讯的几种方式

    并发编程中,我们可能会遇到这样一个场景 A.B两个线程并行,但是我希望保证B线程在A线程执行完了后再执行 这个时候就需要线程间进行通讯 A执行完了后对B说一声,喂,我执行完了 来康康用Java怎么实现 ...

  8. PHP页面间参数传递的四种方式

    我们定义page01.php和page02.php两个php文件,将page01中的内容想办法传递到page02,然后供我们继续使用. 第一种: 使用客户端浏览器的cookie.cookie很容易理解 ...

  9. java实现线程间通信的四种方式

    synchronized同步 public class MyObject { synchronized public void methodA() { //do something.... } syn ...

  10. 服务器间数据传输的四种方式

    scp [优点]简单方便,安全可靠:支持限速参数 [缺点]不支持排除目录 [用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式, ...

最新文章

  1. php swoole编译,编译安装swoole1.7.9,PHP版本5.6.5
  2. 基于Java多线程操作文件案例分享
  3. 在什么情况下,刘强东会丧失京东的控制权?
  4. IoT -- (三) 2018 Top物联网项目排名
  5. CentOS 7 上搭建nginx 1.6
  6. 可视化理解卷积神经网络 - 反卷积网络 - 没看懂
  7. 极限学习机ELM回归预测及其MATLAB代码实现
  8. ADC 前端电路的五个设计步骤(转载)
  9. html chm 打不开,Win7系统中出现CHM打不开的具体解决方法
  10. VM虚拟机分区硬盘/安装win10系统
  11. dsp28335电机控制板资料 永磁同步电机有传感器三闭环foc控制
  12. hⅰgh怎么读音发音英语_gh和ph的发音
  13. win10亮度无法调节
  14. Postman如何使用(三):使用数据文件【入门到精通】
  15. Redis底层数据结构介绍
  16. 自适应云呼HTML官网源码
  17. 广东老火靓汤108种
  18. 谷歌地图街景图中可查看照片拍摄日期
  19. 高新技术企业申请条件是什么?
  20. Flash 应用之我见

热门文章

  1. Drupal 在Views 中自定义筛选 Filter
  2. Python3 抓取微信账单信息
  3. Linux下搭建Oracle11g RAC
  4. C#姓名与机构名称生成专用类
  5. Shine Effect
  6. 电源与地之间的电容作用
  7. 中兴ZXVb860av2.1t刷机固件,芯片晶晨S905l-b,不失效线刷包,当贝桌面
  8. 重启计算机突然断网,今天电脑总是突然断网,怎么回事
  9. Java 100以内的质数
  10. 中国房企加速并购重组