Linux后台服务器开发——Linux下进程间通信的方式有哪些?

  • Linux下进程间通信的方式有:
  • 管道
  • 消息队列
  • 信号
  • 信号量
  • 共享存储
  • 套接字
一、管道
  • 管道是半双工的 , 数据只能向一个方向流动;需要双方通信时 , 需要建立起两个管道
PIPE无名管道详情参阅:
管道的实质是一个内核缓冲区:
进程以先进先出的方式从缓冲区存取数据 , 管道一端的进程顺序的将数据写入缓冲区 , 另一端的进程则顺序的读出数据
该缓冲区可以看做是一个循环队列 , 读和写的位置都是自动增长的 , 不能随意改变 , 一个数据只能被读一次 , 读出来以后在缓冲区就不复存在了
当缓冲区读空或者写满时 , 有一定的规则控制相应的读进程或者写进程进入等待队列 , 当空的缓冲区有新数据写入或者满的缓冲区有数据读出来时 , 就唤醒等待队列中的进程继续读写
无名管道的特点:
只支持单向数据流
只能用于具有亲缘关系的进程之间
没有名字
【Linux后台服务器开发——Linux下进程间通信的方式有哪些?】管道的缓冲区是有限的(管道只存在于内存中 , 在管道创建时 , 为缓冲区分配一个页面大小)
管道所传送的是无格式字节流 , 这就要求管道的读出方和写入方必须事先约定好数据的格式 , 比如多少字节算作一个消息(或命令 , 或记录)等等
FIFO命名管道详情参阅:
匿名管道 , 由于没有名字 , 只能用于亲缘关系的进程间通信 。 为了克服这个缺点 , 提出了有名管道(FIFO)
FIFO是一种文件类型 , 其会创建管道文件让不同进程之间进行通信
二、消息队列
  • 详情参阅:
  • 消息队列是消息的链接表 , 存储在内核中 , 由消息队列标识符标识
  • 特点总结:
  • 消息队列是消息的链表 , 具有特定的格式 , 存放在内存中并由消息队列标识符标识
  • 消息队列允许一个或多个进程向它写入与读取消息
  • 管道和消息队列的通信数据都是先进先出的原则
  • 消息队列可以实现消息的随机查询 , 消息不一定要以先进先出的次序读取 , 也可以按消息的类型读取 。 比FIFO更有优势
  • 息队列克服了信号承载信息量少 , 管道只能承载无格式字节流以及缓冲区大小受限等缺
  • 前主要有两种类型的消息队列:POSIX消息队列以及System V消息队列 , 系统V消息队列目前被大量使用 。 系统V消息队列是随内核持续的 , 只有在内核重启或者人工删除时 , 该消息队列才会被删除
三、信号
  • 详情参阅:
  • 信号(Signals )是Unix系统中使用的最古老的进程间通信的方法之一 。 操作系统通过信号来通知进程系统中发生了某种预先规定好的事件(一组事件中的一个) , 它也是用户进程之间通信和同步的一种原始机制 。 一个键盘中断或者一个错误条件(比如进程试图访问它的虚拟内存中不存在的位置等)都有可能产生一个信号 。 Shell也使用信号向它的子进程发送作业控制信号
  • 常见的信号有:
  • SIGHUP:用户从终端注销 , 所有已启动进程都将收到该进程 。 系统缺省状态下对该信号的处理是终止进程
  • SIGINT:程序终止信号 。 程序运行过程中 , 按Ctrl+C键将产生该信号
  • SIGQUIT:程序退出信号 。 程序运行过程中 , 按Ctrl+\\键将产生该信号
  • SIGKILL:用户终止进程执行信号 。 shell下执行kill -9发送该信号(该信号不能被捕获)
  • SIGTERM:结束进程信号 。 shell下执行kill进程pid发送该信号(该信号可以被捕获)
  • SIGALRM:定时器信号
  • SIGCLD:子进程退出信号 。 如果其父进程没有忽略该信号也没有处理该信号 , 则子进程退出后将形成僵尸进程
  • 信号是软件层次上对中断机制的一种模拟 , 是一种异步通信方式
四、信号量
  • 详情参阅:://blog.csdn.net/qq_41453285/article/details/90612787
  • 信号量是一个计数器 , 用于多进程对共享数据的访问 , 信号量的意图在于进程间同步
  • 可以用来处理生产者与消费者之间的关系
PV操作
P(SV):如果SV的值大于0 , 就将它减1;如果SV的值为0 , 则挂起进程的执行
V(SV):如果有其他进程因为等待SV而挂起 , 则唤醒之;如果没有 , 则将SV加1
例如:
初始化时二进制信号量SV的值为1
此时进程A执行了P(SV)操作将SV减1 , 则进程B若再执行P(SV)则会被挂起
当A执行完离开关键代码段之后 , 并执行V(SV)操作将SV加1 , 则会唤醒进程B开始执行
Linux后台服务器开发——Linux下进程间通信的方式有哪些?文章插图