linux系统-IPC进程间通信

  • 1.进程间通信的方式
  • 2.管道(pipe)
  • 3.共享映射区
  • 4.信号

1.进程间通信的方式

文件,管道,信号、信号量,共享映射区(共享内存),消息队列,管道,套接字(socket)

着重讲下:

  • 管道(使用简单)
  • 信号(开销比较小)
  • 共享映射区
  • 套接字(低速稳定)

一般都是通过内核共享空间进行通信

2.管道(pipe)

  1. 无名管道,半双工的通信方式(数据流向固定:只能 a 的数据写给 b ,或者 b 的数据写给 a )
  2. 管道大家可以简单的理解为一种特殊的文件形式,我们可以用文件的读写方法,不是一种简单的文件,只会占用内存。
  3. 管道只能是有血缘关系的进程间通信
  4. 数据不能自己写自己读
  5. 数据一旦读走,不能再次读
#include <stdio.h>
#include <unistd.h>int main(){int fd[2];pid_t  pid;char buf[20];// 创建管道int ret = pipe(pipefd);if(ret != 0){printf("create pipe error!\n");}pid = fork();if(pid < 0){printf("fork error!\n");}else if(pid == 0){// 子进程close(fd[1]); // 关闭写端// 等等在读sleep(1);read(fd[0],buf,11);// 没有其它读写操作了可以关闭 fd[0]printf("pipe read : %s",buf);}else{// 父进程close(fd[0]); // 关闭读端write(fd[1],"hello pipe\n",11);// 没有其它读写操作了可以关闭 fd[1]}return 0;
}

非法操作:

  1. 读管道:
    1.1 管道中有数据,read 返回实际读到的数据

    1.2 管道中无数据:

     1.2.1 管道写端被关闭,read 返回 01.2.2 管道写端如果没有被关闭,会阻塞等待
    
  2. 写管道:
    2.1 读端被关闭,异常终止(信号导致)

    2.2 读端未关闭:

     2.2.1 管道数据已满,阻塞等待写入数据(其他人读走)2.2.2 管道未满,直接将数据写入
    

3.共享映射区

binder 驱动,腾讯 MMKV,xlog (日志库)中都会有 mmap函数

以下是binder驱动的流程

1、注册建立ServiceManager表。
2、Service1、Service2通过Binder驱动申请注册到ServiceManager中。
3、Client需要与Service2进行通信,跨进程无法直接通信,需要先通过ServiceManger中查询到Service2。借助Binder驱动
返回一个Service2的代理对象。Client直接跟Service2代理对象进行操作,通过Binder驱动映射操作Service2真实对象,从而完成通信。- Binder是一种通信机制;
- 对于Service来说Binder指的是Binder本地对象,对于Client来说Binder指的是Binder的代理对象;
- 对于传输过程而言,Binder是可以跨进程传递的对象。为什么要使用Binder?
性能方面在移动设备上(性能受限制的设备,比如要省电),广泛地使用跨进程通信对通信机制的性能有严格的要求,Binder相对出传统的Socket方式,
更加高效。Binder数据拷贝只需要一次,而管道、消息队列、Socket都需要2次,共享内存方式一次内存拷贝都不需要,但实现方式又比较复杂。安全方面传统的进程通信方式对于通信双方的身份并没有做出严格的验证,比如Socket通信ip地址是客户端手动填入,很容易进行伪造,而Binder机制从协
议本身就支持对通信双方做身份校检,因而大大提升了安全性。

mmap 注意事项

  1. 指定映射区的大小,必须要小于文件大小
  2. 映射区大小必须要大于 0 ,否则会异常
  3. 创建映射区需要 read 权限,mmap 的读写权限应该 <= 文件的权限
  4. 文件可以先关闭
  5. 偏移量必须是 4k 的整数倍
  6. MAP_PRIVATE 只会对内存进行修改,不会反应到磁盘上

mmap 万能调用方法:
open(O_RDWR);
mmap(NULL, 有效大小,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/mman.h>
#include <fcntl.h>void sys_err(const char * msg){perror(msg);exit(0);
}int main(){/*void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);int munmap(void *addr, size_t length);*//**  addr:地址,一般可以不传(NULL),传入传出参数*  length:内存大小*  prot:*       PROT_EXEC 内容可以被执行*       PROT_READ 内容可以被读取*       PROT_WRITE 内容可以被写*       PROT_NONE 内容不可访问*  flags:*       MAP_SHARED 共享*       MAP_PRIVATE 私有f*       MAP_ANONYMOUS 匿名映射(不基于文件),fd 参数就传 -1*  fd: 文件句柄*  offset:偏移大小,必须是 4K 的整数倍,一个物理页映射是 4K。     *  */// 创建打开一个文件int fd;char *p;fd = open("test_map",O_ROWR|O_CREAT|O_TRUNC,0644);if(fd == -1){sys_err("open file error");}// 文件变大(不增大的话,映射的是 0)ftruncate(fd,20);p = (char*)mmap(NULL,20, PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);// 关闭了文件,那么后面通过操作 mmap 的空间,能不能写入文件? 能close(fd);// 关闭的是系统函数到文件的操作,而 mmap 映射不受影响if(p == MAP_FAILED){sys_err("mmap error");}strcpy(p,"hello mmap\n");printf("--->%s",p);// 释放 mmapmunmap(p,20);return 0;
}

还有示例请可以看这儿

4.信号

进程间通信的机制,内核自带的,信号不能携带大量的数据,一般就是一个数字,只有在特定场景下才调用。

怎样才会产生信号:

  1. 按键产生: ctrl + c, ctrl+z
  2. 系统调用 kill , raise, abort
  3. 软件条件产生, alarm
  4. 硬件异常产生,非法访问内存,除 0 ,内存对齐等等
  5. 命令产生

信号的处理方式:

  1. 忽略此信号
  2. 执行系统默认动作
  3. 捕捉用户希望动作

信号处理的原理:

  • 信号屏蔽字: 用于屏蔽x信号,内部实现就是一个集合,当 x 信号屏蔽后,再收到该信号,信号处理将推后
  • 未决信号集: 信号抵达 x 信号位反转为 1 , 当信号被处理后重新置为 0

man 7 signal

       Signal     Value     Action   Comment──────────────────────────────────────────────────────────────────────SIGHUP        1       Term    Hangup detected on controlling terminalor death of controlling processSIGINT        2       Term    Interrupt from keyboardSIGQUIT       3       Core    Quit from keyboardSIGILL        4       Core    Illegal InstructionSIGABRT       6       Core    Abort signal from abort(3)SIGFPE        8       Core    Floating point exceptionSIGKILL       9       Term    Kill signalSIGSEGV      11       Core    Invalid memory referenceSIGPIPE      13       Term    Broken pipe: write to pipe with noreadersSIGALRM      14       Term    Timer signal from alarm(2)SIGTERM      15       Term    Termination signalSIGUSR1   30,10,16    Term    User-defined signal 1SIGUSR2   31,12,17    Term    User-defined signal 2SIGCHLD   20,17,18    Ign     Child stopped or terminatedSIGCONT   19,18,25    Cont    Continue if stoppedSIGSTOP   17,19,23    Stop    Stop processSIGTSTP   18,20,24    Stop    Stop typed at ttySIGTTIN   21,21,26    Stop    tty input for background processSIGTTOU   22,22,27    Stop    tty output for background processSignal       Value     Action   Comment────────────────────────────────────────────────────────────────────SIGBUS      10,7,10     Core    Bus error (bad memory access)SIGPOLL                 Term    Pollable event (Sys V).Synonym for SIGIOSIGPROF     27,27,29    Term    Profiling timer expiredSIGSYS      12,31,12    Core    Bad argument to routine (SVr4)SIGTRAP        5        Core    Trace/breakpoint trapSIGURG      16,23,21    Ign     Urgent condition on socket (4.2BSD)SIGVTALRM   26,26,28    Term    Virtual alarm clock (4.2BSD)SIGXCPU     24,24,30    Core    CPU time limit exceeded (4.2BSD)SIGXFSZ     25,25,31    Core    File size limit exceeded (4.2BSD)Signal     Value     Action   Comment
名称        编号       事件      默认执行动作Term : 终止进程
Ign : 忽略
Core:终止进程,生成 Core 文件(可以帮助开发者检测)
Stop:停止进程
Cont:继续运行

Process.killProcess(Process.myPid());

kill pid (发送信号) : 第一个参数,,< 0 往 |pid| 发个信息,0 杀死进程组,不要传 -1

  • pid > 0 往 pid 进程发个信号
  • pid < 0 往 |pid| 发个信息
  • pid = 0 杀死进程组
  • 不要传 -1 ,会杀死所有能杀死的进程

音视频:06.linux系统-IPC进程间通信相关推荐

  1. linux音视频质量,linux好用的视频播放器

    想知道在Linux上应该使用哪种视频播放器吗?我们在这里列出了Linux发行版中可用的7款最佳开源视频播放器. 您可以在Linux上观看在线流媒体服务,但是在电脑上观看电影/电视连续剧或其他视频内容还 ...

  2. 用腾讯即时通讯IM和实时音视频实现陪玩系统源码的语音通话功能

    在陪玩系统源码中,用户之间主要的交流方式就是语音通话,实时互动性的语音通话能让人产生面对面交谈的感觉,所以在陪玩系统源码中,语音通话功能的开发非常重要,今天我们就一起来看看如何用腾讯即时通讯IM和实时 ...

  3. linux看视频插件,Linux系统下安装Adobe Flash Player插件观播放视频

    linux系统上火狐浏览器看视频时无法播放视频,提示没有安装flash player插件,linux系统如何安装flash player插件呢? 我们在此以Centos/Redhat 7.3为例,方法 ...

  4. linux搭建音视频服务器,Linux平台部署音视频SDK实现即时通讯功能

    Linux平台部署音视频SDK实现即时通讯功能 下面介绍一款强大的音视频即时通讯平台给大家,它就是--云智真音视频SDK. 云智真提供一套跨平台的音.视频即时通讯解决方案,基于先进的H.264视频编码 ...

  5. linux服务器视频转换,Linux系统下视频转换软件使用方法

    Linux系统下视频转换软件使用方法 Linux下的视频转换:mencoder 制作适合在智能手机和PDA上观看的mpeg4视频. Linux上有一个很强大的视频音频转换软件,就是Mplayer自带的 ...

  6. 在linux上剪视频,在Linux系统上安装和使用Video Trimmer快速修剪视频

    如果想在Linux系统上快速修剪视频,那就使用Video Trimmer,此工具操作容易且功能集中,旨在让您快速的完成相应的工作,同时安装Video Trimmer也非常的简单. 简介 Video T ...

  7. Cable Messenger 多人实时音视频聊天:系统架构

    文章目录 通信方式 STUN 与 TURN 服务 信令系统 处理架构 做音视频聊天是一件有趣的事,因为你可以有机会去学到很多其它领域的东西.Cable Messenger 的音视频聊天主要采用Goog ...

  8. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

  9. 网站在线客服系统实时语音视频聊天实战开发,利用peerjs vue.js实现webRTC网页音视频客服系统...

    webRTC机制和peerjs库的介绍在其他博客中已经有了很多介绍,这里我直接搬运过来 一.webrtc回顾 WebRTC(Web Real-Time Communication)即:网页即时通信. ...

最新文章

  1. h265webplayer
  2. python的内置对象有哪些、列举说明_Python内置对象汇总
  3. 易创课堂成都站给你寄来一包干货,请注意查收
  4. ActionBar设置自定义setCustomView()留有空白的问题
  5. OEA 框架中集成的 RDLC 报表介绍
  6. SQL Server 插入数据报IDENTITY_INSERT设置为off
  7. vim 环境写 markdown 的插件推荐
  8. vue 侦听器侦听对象属性_SQL Server始终处于侦听器状态
  9. python代码读取外部变量_在Python中从外部文件中写入和读取特定的变量
  10. 利用自定义事件实现不同窗体间的通讯 -- C#篇
  11. 【HTTPServer】借助Python建立简易的HTTP服务
  12. C PrimerPlus 第五章程序示例
  13. android xposed miui9,vxposed在小米-安卓9上闪退
  14. [激光原理与应用-25]:《激光原理与技术》-11- 激光产生技术-非线性技术之激光倍频、非线性晶体CLBO、BBO、LBO
  15. SPI器件的菊链配置
  16. 如何写出高效的代码?(持续更新)
  17. Android 获取手机系统版本号、获取手机型号、获取手机厂商、获取手机IMEI、获取手机CPU_ABI、获取手机唯一识别码
  18. Servlet——映射细节、3.0注解配置、Servlet是单例会造成线程不安全问题
  19. 【翻译】对于Ext JS 5,你准备好了吗?
  20. android去除root,RE管理器root权限彻底清除教程[图]

热门文章

  1. YUV基础知识《转载》
  2. linux 网卡强制千兆,LINUX网卡(设置千兆网卡速度及模式)
  3. getTime()用法
  4. 深入浅出说智图—POW矿池篇
  5. C#编写三维自主导线高级计算器
  6. 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)
  7. 全国计算机一级考试关于电子邮件,荐计算机等级考试题库:一级MS Office常考知识点“电子邮件、文件传输、Internet其他应用”...
  8. 周-周内秒转化为utc时间 c语言实现
  9. 基于ZYNQ移动机器人控制器设计(1)背景
  10. sql server视图排序