##Linux##进程间通信的方式


目的:

  • 数据传输
  • 资源共享
  • 通知事件
  • 进程控制

通信分类

  1. 管道:

    管道分为匿名管道和命名管道

    • 匿名管道:创建无名管道
    int pipe(int fd[2]);
            fd[0]---->表示读
            fd[1]---->表示写
    

    由fork()来共享管道原理

    父进程:关掉fd[1]               子进程:关掉fd[0]
    特点:        只能用于具有共同祖先的进程之间通信,一个管道由一个进程创建,该进程调用fork(),此后父子进程可以共享该管道。
                       生命周期随进程
                        提供流式服务
                        半双工通信,数据只能向一个方向流动
    2、命名管道:在不相关的进程间交换数据
    创建方法:命令创建:mkfifo    filename
                    函数创建:int mkfifo(filename,mode)
    两种管道的区别:匿名管道由pipe创建并打开,命名管道由mkfifo创建,由open打开
                                工作完成后,具有相同的意义

  2. 消息队列
    • 具有四次系统调用
    • 提供一个从一个进程向另外一个进程发送一块数据的方法
    • 每个数据块都被认为是有一个类型,接收者接收的数据块类型可以不同
    • 系统消息队列总数具有上限(MSGMNI),每个消息的长度具有最大限度(MSGMAX)
      消息队列函数,及参数代表含义


      ipcs------->查看IPC资源     ipcrm-------->删除IPC资源
  3. 共享内存

    特点:最快的进程间通信方式
    共享内存函数及参数代表含义



  4. 信号量

    主要用于同步和互斥
    同步:多个进程相互配合完成一项工作
    互斥:各进程要求共享资源,有些资源要求互斥使用,进程间就会竞争这些资源,就叫进程间互斥。
    信号量与P,V操作:
    信号量:互斥:PV在同一个进程中    同步:PV在不同进程中
    信号量值得含义:

    >0   表示可用资源数
    =0   表示无资源可用
    <0   表示等待队列中进程个数
    信号量的函数及其参数


    以上就是进程间通信的四种方法啦~

猜你喜欢

转载自blog.csdn.net/qq_36474990/article/details/79868140