• [C++]Linux之进程间通信小结【待完善】


    【此博文,待日后完善】

    进程通信方式:

      1.管道通信(匿名管道/命名管道)

      2.消息队列

      3.共享内存

      4.信号量

      

    1.管道通信

    无名管道用于具有亲缘关系进程间的通信
    管道是半双工的,数据只能单向流动(双方通信需建立两个管道)
    管道只能用于父子进程或兄弟进程之间
    管道对于管道两端的进程而言就是一个文件,并单独构成一种文件系统,存在于内存中
    写管道的内容添加在管道缓冲区的末尾,读管道则从缓冲区头部读出

    有名管道在普通管道具备功能基础上,通过给管道命名的方法变成管道文件,允许无亲缘关系进程间通过访问管道文件进行通信

    2.消息队列

    也叫报文队列,是消息的链接表
    有两种类型的消息队列:POSIX消息队列和系统V消息队列
    运行于同一台机器上的进程间通信,与管道类似
    可以用流管道或套接口方式取代
    系统V消息队列
    int msgget( ); 创建一个新队列或打开一个存在的队列
    int msgsnd( ); 把消息添加到msgid代表的消息队列的末尾,消息的大小由msgsz指定。
    int msgrcv( ); 从msgid代表的消息队列中取走一个消息。
    int msgctl( ); 在由msgid标识的消息队列上执行cmd指定的操作。

    3.共享内存

    将同一块内存区映射到共享它的不同进程的地址空间中
    效率高:进程可以直接读写内存,不需任何数据拷贝,避免了内核空间与用户空间的切换
    内核未对共享内存的访问提供同步机制,需要依靠某种同步机制来同步对共享进程的访问
    POSIX共享内存
    通过用户空间挂载的tmpfs文件系统实现,持久化的
    API:shm_open( )、mmap( )、munmap( )、shm_unlink( )等
    System V共享内存
    由内核本身的tmpfs实现,非持久化的
    API:shmget( )、shmat( )、shmdt( )、shmctl( )等

    4.信号量

    也称信号灯,用来协调不同进程间的数据对象
    提供对进程间共享资源访问控制的手段,用来保护共享资源
    还可用于进程间及同一进程不同线程间的进程同步
    两种类型
    二值信号灯:取值只能为0或1,类似于互斥锁
    计算信号灯:取值可以为任意非负值(受内核本身约束)
    POSIX信号量和System V信号量(与共享内存的两种方式类似)

    5.参考文献:

      [Linux进程间通信——使用命名管道](http://blog.csdn.net/ljianhui/article/details/10202699) 【命名管道讲解得非常有条理性】

  • 相关阅读:
    【转】【MFC】 StretchBlt绘图图像失真
    【转】MFC 各类型相互转换
    【转】MFC CListCtrl 使用技巧
    【数学】关于已知线段长度获取某一点对应线段的百分比
    【MySQL】MySQL 常用语法之锁表与解锁表
    C#通用类库
    WPF Knowledge Points
    WPF中的WndProc
    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值
    c#正则获取html里面a标签href的值
  • 原文地址:https://www.cnblogs.com/johnnyzen/p/8029300.html
Copyright © 2020-2023  润新知