文章目录

  • ​​1.进程内存空间布局​​
  • ​​2.Linux进程间通信机制​​
  • ​​(1)管道​​
  • ​​(2)命名管道​​
  • ​​(3)XSI IPC机制​​
  • ​​(4)IPC对象的key值和ID​​
  • ​​(5)XSI IPC机制的使用规律​​

1.进程内存空间布局

  • 进程和进程之间存在独立的内核资源以及用户空间资源

2.Linux进程间通信机制

(4.4)Linux进程间通信机制_命名管道

(1)管道

  • 管道是最古老、最简单的UNIX进程间通信机制
  • 管道是一种特殊文件
  • 管道的局限性
    半双工:一个进程写,一个进程读
    只能在父子进程之间使用
  • filedes:file descripe
函数原型
头文件:unistd.h
int pipe(int fildes[2]);

参数:
程序通过文件描述符fildes[0]和fildes[1]来访问管道

filedes[0]只能用于管道读操作,filedes[1]只能用于管道写操作

写入fildes[1]的数据可以按照先进先出的顺序从fildes[0]中读出

返回值:成功返回0 ,出错返回- 1

(2)命名管道

  • 管道只能在父子进程之间使用
  • FIFO 也被称为命名管道, FIFO 是一种特殊的文件
    (创建FIFO 类似于创建文件,FIFO 的路径名存在于文件系统中)
  • 创建FIFO 之后可以通过文件I/O 对其进行操作
  • 非父子进程可以通过文件名来使用FIFO
函数原型
头文件:sys/types.h ,sys/stat.h
int mkfifo(const char *pathname, mode_t mode) ;

参数:
pathname:文件名(绝对路径)
mode:文件类型、权限等

返回值:成功返回0 ,出错返回- 1

(3)XSI IPC机制

  • 信号量集(semaphore set ):用于实现进程之间的同步与互斥
  • 共享内存(shared memory ):用于在进程之间高效地共享数据,适用于数据量大,速度要求高的场景
  • 消息队列(message queue ):进程之间传递数据的一种简单方法
  • 列出IPC对象:三种
    信号量集和消息队列往往是出现在某个瞬时

(4)IPC对象的key值和ID

  • Linux 系统中的IPC 对象都是全局的,为每个IPC 对象分配唯一的ID
  • 在IPC 操作中通信各方需要通过ID 来指示操作的IPC对象,需要有机地让通信各方(各个进程)获取IPC对象的ID,即:真正创建IPC对象的进程只有一个,其它的进程都是使用该IPC对象
  • 创建IPC 对象的进程通过创建IPC 对象函数的返回值可获取ID值,但是未创建IPC 对象的进程如何获取IPC 对象的ID 值并使用该对象呢?
    IPC 机制的 ID 值为动态分配,无法提前约定,不能跨进程传递!
  • 多个进程提前约定使用相同的key值做为参数,来创建IPC 对象或打开已经创建的IPC 对象
    如果通信各方(进程)在创建/ 打开IPC 对象时使用相同的key 值:
    首次使用该key值创建IPC对象的进程将真正创建该IPC对象,并获取其ID值
    后续使用该key值创建IPC对象的进程都将在内核中找到该IPC对象并打开它,从而获取其ID值(这是因为:进程之间的执行顺序,互相是不知道的)
  • IPC 对象与key 值一一对应,因此key 通过ftok 函数来产生独特的key 值,避免重复
头文件: sys/types.h ,sys/ipc.h
key_t ftok( char * pathname, int proj_id )

参数
pathname 是指定的文件名,可以是特殊文件也可以是目录文件)
proj_id 是子序号

如果要确保key_t 值不变,需要确保ftok 所指定的文件名不被删除

(5)XSI IPC机制的使用规律

(4.4)Linux进程间通信机制_文件名_02