Linux系统编程(七):进程间通信(下)

参考引用

  • UNIX 环境高级编程 (第3版)
  • 嵌入式Linux C应用编程-正点原子

1. 进程间通信简介

  • 进程间通信(interprocess communication,IPC)指两个进程之间的通信
    • 系统中的每一个进程都有各自的地址空间,并且相互独立、隔离,每个进程都处于自己的地址空间中,所以同一个进程的不同模块(如不同的函数)之间进行通信都是很简单的,如使用全局变量等
    • 但是,两个不同的进程之间要进行通信通常是比较难的,因为这两个进程处于不同的地址空间中,对于一些复杂、大型的应用程序,则会根据实际需要将其设计成多进程程序,如 GUI、服务区应用程序等

2. 进程间通信的机制有哪些?

  • Linux 内核提供了多种 IPC 机制,基本是从 UNIX 系统继承而来,而对 UNIX 发展做出重大贡献的两大主力:贝尔实验室及 BSD(加州大学伯克利分校的伯克利软件发布中心)在进程间通信方面的侧重点有所不同

    • 贝尔实验室对 UNIX 早期的进程间通信手段进行了系统的改进和扩充,形成了 “System V IPC”,通信进程局限在单个计算机内,随后改进形成 POSIX IPC
    • BSD 则跳过了该限制,形成了基于套接字(Socket,也就是网络)的进程间通信机制
  • 总结

    • UNIX IPC:管道、FIFO、信号
    • System V IPC:信号量、消息队列、共享内存
    • POSIX IPC:信号量、消息队列、共享内存
    • Socket IPC:基于 Socket 进程间通信

3. 管道和 FIFO

  • 管道是 UNIX 系统上最古老的 IPC 方法,把一个进程连接到另一个进程的数据流称为管道,管道被抽象成一个文件
  • 管道包括三种
    • 普通管道 pipe
      • 数据只能单向传输(单工)
      • 只能在父、子或者兄弟进程间使用
    • 流管道 s_pipe
      • 数据可以双向传输(半双工,发送和接收不能同时进行)
      • 只能在父子或兄弟进程间使用
    • 有名管道 name_pipe(FIFO)
      • 数据可以双向传输(半双工,发送和接收不能同时进行)
      • 允许在不相关(不是父子或兄弟关系)的进程间进行通讯

4. 信号

  • 信号用于通知接收信号的进程有某种事件发生,所以可用于进程间通信
  • 除了用于进程间通信之外,进程还可以发送信号给进程本身

5. 消息队列

  • 消息队列是消息的链表,存放在内核中并由消息队列标识符标识
    • 消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺陷
    • 消息队列包括 POSIX 消息队列和 System V 消息队列
  • 消息队列是 UNIX 下不同进程之间实现共享资源的一种机制,UNIX 允许不同进程将格式化的数据流以消息队列形式发送给任意进程,有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息

6. 信号量

  • 信号量是一个计数器,与其它进程间通信方式不大相同,它主要用于控制多个进程间或一个进程内的多个线程间对共享资源的访问,相当于内存中的标志,进程可以根据它判定是否能够访问某些共享资源,同时,进程也可以修改该标志,除了用于共享资源的访问控制外,还可用于进程同步
  • 它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源,主要作为进程间及同一个进程内不同线程间的同步手段。Linux 提供了一组精心设计的信号量接口来对信号量进行操作,它们声明在头文件 sys/sem.h 中

7. 共享内存

  • 共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但其它的多个进程都可以访问,使得多个进程可以访问同一块内存空间
  • 共享内存是最快的 IPC 方式,它是针对其它进程间通信方式运行效率低而专门设计的,它往往结合其它通信机制如信号量来使用,以实现进程间的同步和通信

8. 套接字(Socket)

  • Socket 是一种 IPC 方法,是基于网络的 IPC 方法,允许位于同一主机(计算机)或使用网络连接起来的不同主机上的应用程序之间交换数据,也就是网络通信

你可能感兴趣的:(Linux系统编程,linux,c语言,嵌入式,进程间通信,IPC)