zoukankan      html  css  js  c++  java
  • 《Linux系统编程》----DAY4

    进程间通信方式(2021.2.7)

    ​ 本质:内核空间中的一块缓冲区
    image

      1. 管道(使用最简单)
      1. 信号(开销最小)
      1. 共享映射区(无血缘关系)
      1. 本地套接字(最稳定)

    管道

    实现原理:内核借助环形队列机制,使用内核缓冲区实现

    ​ 特质:
    1.伪文件

    2.管道中的数据只能一次读取

    3.数据在管道中,只能单向流动

    局限性:

    ​ 1、自己写,不能自己读

    ​ 2、数据不可以反复读

    ​ 3、双向半单工通信

    ​ 4、血缘关系进程可用

    pipe函数: 创建,并打开管道

    int pipe(int fd[2]);

    参数:
    fd[0]:读端

    fd[1]:写端

    返回值:
    成功:0
    失败:-1

    管道的读写行为:

    一、读管道

    ​ 1.管道中无数据,

    ​ 1)无写端,read返回00::

    ​ 2)有写端,read阻塞等待

    ​ 2.管道有数据,read返回实际读到的字节数

    二、写管道

    ​ 1.无读端,异常终止。(SIGPIPE导致的)

    ​ 2.有读端:

    ​ 1)管道已满,阻塞等待

    ​ 2)管道未满,返回写出的字节个数

    pipe管道:

    ​ 父子进程通信

    ​ 兄弟进程通信

    fifo管道:

    ​ 无血缘关系进程通信

    ​ 命名管道:mkfifo

    文件实现进程间通信:

    ​ 打开的文件是内核中的一块缓冲区。多个无血缘关系的进程,可以同时访问该文件

    共享内存映射

    mmap映射

    	 void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
    

    参数:

    ​ addr:指定映射区的首地址。通常传NULL,表示让系统自动分配

    ​ length:共享内存映射区的大小

    ​ prot:共享内存映射区的读写属性。PROT_READ,PROT_WRITE, PROT_READ|PROT_WRITE

    ​ flags:标注共享内存的共享属性。MAP_SHARED,MAP_PRIVATE

    ​ fd;用于创建共享内存映射区的那个文件的 文件描述符

    ​ offset:偏移位置(4k的整数倍)

    返回值:

    ​ 成功:映射区的首地址

    ​ 失败:MAP_FAILED,,errno

    使用注意事项:

    ​ 1.用于创建映射区文件的大小为0,实际指定非0大小创建映射区,出 总线错误

    ​ 2.用于创建映射区文件的大小为0,实际指定0大小创建映射区,出 无效参数错误

    ​ 3.用于创建映射区的文件读写属性为 只读 ,映射区属性

    ​ 4.创建映射区,需要read权限。mmap的读写权限,应该<=文件的open权限。只写不行

    ​ 5.文件描述符fd,在mmap创建映射区完成即可关闭。后续访问文件,用 地址访问 没有问题

    ​ 6.offset必须是4096的整数倍。(MMU映射的最小单位 4k)

    ​ 7.对申请的映射区内存,不能越界访问

    ​ 8.munmap用于释放的地址,必须是nmap申请返回的地址

    ​ 9.映射区访问权限为”私有“MAP_PRIVATE,对内存所做的所有修改,只在内存中有效

    ​ 10.映射区访问权限为”私有“MAP_PRIVATE,只需要open文件时,有读权限,用于创建映射区即可

    mmap函数的保险调用方式:

    1.fd=open("文件名",O_RDWR)

    2.mmap(NULL,有效文件大小,PROT_READ|PROT_WRITE,MAP_SHARED,fd,0);

    父子进程使用 mmap进程间通信:

    ​ 1.父进程创建映射区。open(O_RDWR) mmap();

    ​ 2.指定MAP_SHARED权限

    ​ 3.fork()创建子进程

    ​ 4.一个进程读,另外一个进程写

    ​ 5.使用munmap(p,len)关闭

    无血缘关系进程间mmap通信:

    ​ 两个进程 打开同一个文件,创建映射区

    ​ 指定flags为MAP_SHARED

    ​ 一个进程写入,另外一个进程读出

    【注意】:
    无血缘关系进程间通信。
    mmap:数据可以重复读取
    fifo:数据只能一次读取

    mmap匿名映射区

    ​ 参数:

    ​ flags:MAP_ANONYMOUS

    p=(int*)mmap(NULL,40,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANNOYMOUS,-1,0);
    

    当操作系统不支持该参数时

    fd=open("/dev/zero",O_RDWR);
    
    p=(int*)mmap(NULL,40,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANNOYMOUS,fd,0);
    
  • 相关阅读:
    亚像素
    dmysql 与QT的连接
    opencv中ptr的使用
    对图片对比度和亮度的理解
    opencv中的各种滤波设计
    人脸检测相关介绍
    opencv中相关的矩阵运算
    形态学处理
    阀值化 threshold
    Python深浅拷贝
  • 原文地址:https://www.cnblogs.com/hongweijiang/p/14514232.html
Copyright © 2011-2022 走看看