Linux——进程间通信

进程间通信

  • 进程间通信
      • 进程间通信的本质
      • 进程间通信的目
      • 如何可以做到进程间通信
  • 进程间通信分类
      • 管道
        • 什么是管道?
        • 匿名管道
        • 管道的特点
        • 管道的四种情况
        • 命名管道
        • 匿名管道和命名管道的区别
      • System V
        • 共享内存
          • 共享内存建立的过程
          • 共享内存函数
          • 共享内存特点
        • 消息队列
        • 信号量
      • POSIX

进程间通信

进程间通信的本质

进程间通信的本质就是不同的进程可以看见同一份资源

进程间通信的目

  1. 数据传输:一个进程需要将它的数据发送给另外一个进程
  2. 资源共享:多个进程之间共享相同的资源
  3. 通知事件:一个进程需要向另外一个或者一组进程发送消息,通知发生了什么事件(如果进程终止时就要通知父进程)
  4. 进程控制l:有些进程希望完成控制另外一个进程的执行,此时控制进程希望能够拦截另外一个进程的所有陷入和异常,并且能够及时知道它的状态的改变

如何可以做到进程间通信

  • 进程运行时是具有独立性的
  • 进程间通信一般需要借助第三方资源(操作系统)
  • 通信的本质就是数据的拷贝

进程间通信分类

管道

什么是管道?

我们把一个进程连接到另外一个进程的一个数据流称为“管道”。

匿名管道

匿名管道通常是父子进程进行通信的一种方式。
Linux——进程间通信_第1张图片

管道的特点

  • 只能用于具有共同祖先的进程之间的通信
  • 管道提供流式服务
  • 进程退出管道释放,管道的生命周期随进程
  • 内核会对管道操作进程同步和互斥
  • 管道是半双工的,数据只能向一个方向流动,如果需要双方通信,那么就需要建立两个管道

管道的四种情况

  • 不写,一直读,读被阻塞
  • 不读,一直写,写被阻塞
  • 写完关闭,读返回值为0
  • 读关闭,一只写,写方被操作系统杀掉,写入无意义

命名管道

匿名管道只能用在具有公共祖先(具有亲缘关系)的进程之间,但是我们如果想在没有亲缘关系的进程之间使用进程通信,我们可以使用FIFO文件来处理,它通常被称为命名管道。

匿名管道和命名管道的区别

  • 匿名管道由pipe函数创建并打开
  • 命名管道用mkfifo函数创建,打开使用open
  • 匿名管道和命名管道唯一的区别就是创建和打开的方式不同

System V

System V进程间通信是OS特地设计的通信方式
分为:共享内存、消息队列、信号量前两种是为了传送数据为目的,后面的信号量是为了保证进程的同步和互斥。

共享内存

共享内存的生命周期是随内核的。
Linux——进程间通信_第2张图片

共享内存建立的过程
  1. 申请共享内存——物理内存已经开辟好了
  2. 共享内存挂接到地址空间——建立映射关系
  3. 去关联共享内存——修改页表,取消映射关系
  4. 释放共享内存——内存归还给系统
共享内存函数

shmget函数

功能:用来创建共享内存
原型: int shmget(key_t key, size_t size, int shmflg);
参数
key:这个共享内存段名字
size:共享内存大小
shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

shmctl函数

功能:用于控制共享内存
原型
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数
shmid:由shmget返回的共享内存标识码——要操作哪一个文件
cmd:将要采取的动作(有三个可取值)
buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

shmat函数

功能:将共享内存段连接到进程地址空间
原型
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数
shmid: 共享内存标识
shmaddr:指定连接的地址
shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1

shmdt函数

功能:将共享内存段与当前进程脱离
原型
int shmdt(const void *shmaddr);
参数
shmaddr: 由shmat所返回的指针
返回值:成功返回0;失败返回-1
注意:将共享内存段与当前进程脱离不等于删除共享内存段

共享内存特点
  • 速度快——拷贝次数少
  • 不提供任何保护机制(没有互斥和同步)

消息队列

  • 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法
  • 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值
  • IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核

信号量

信号量主要用于同步和互斥
信号量本质是一个计数器,用来描述临界资源中资源的数目

POSIX

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

你可能感兴趣的:(Linux,linux)