linux进程间通信:IPC对象 概念介绍(扫盲)

文章目录

      • 什么是IPC对象
      • IPC分类
        • System V IPC
        • POSIX IPC
      • IPC对象的基本概念
        • IPC标识符
        • IPC key
          • IPC key的创建方法
      • IPC对象的引用
        • 使用的基本流程
        • POSIX 和 system V 的对比
        • POSIX 编程注意事项

什么是IPC对象

IPC:inter-process communication,进程间通信对象;包括如下组件:

  • 管道通信 :FIFO,PIPE,流式数据
  • 消息队列:message queue
  • 信号量:semaphore
  • 共享内存:share memory

IPC分类

System V IPC

当前系统调用版本主要是类unix和linux操作系统之中包含,它是在linux操作系统出现之前发布的标准

  • 消息队列:system V message queue
  • 信号量:system V semphore
  • 共享内存:system V share memory

POSIX IPC

该版本为linux操作系统发布的系统调用接口标准,同时该标准还兼容了system V 的标准

  • 消息队列:POSIX message queue
  • 信号量:POSIX semphore
  • 共享内存:POSIX share memory

IPC对象的基本概念

-支持不同的进程通过ipc对象通信,IPC对象是存储在内核之中,且全局可见。

  • 每个IPC对象在内核之中有自己的数据结构,定义在各自头文件
  • 如何引用IPC对象
    类似于普通文件是通过文件名(文件描述符)进行读写操作,通过IPC对象:IPC key和 IPC标识符进行IPC对象的读写操作。

IPC标识符

  • 类似于文件描述符,可以用一个IPC标示符来引用一个IPC对象
  • IPC对象描述符类似于文件描述符,是一个整数,是IPC对象的内部名字
  • 当多个进程引用同一个IPC对象时,需要一个统一的外部名
  • 类似于文件名,每个IPC对象与一个key相关联

IPC key

IPC key,ipc对象的外部名,是一个独一无二的整数,用来确保ipc对象的唯一性

  • 该整数类型为key_t,在sys/types.h中被定义为长整型
  • 普通文件是通过open打开一个文件名,获得文件描述符;IPC队形是通过get可根据给定的key 去创建一个IPC对象,并返回IPC标识符
IPC key的创建方法
  • 随机选取一个整数作为key值
    所有整数放到一个头文件,使用IPC对象的程序包含这个头文件
    一般随机取整数用在自己电脑上,如果是服务器,多用户并发使用则又可能冲突。
  • 在get系统调用中将IPC_PRIVATE常量作为key值
    每个调用都会创建一个全新的IPC对象,保证来每个对象拥有唯一的key
  • 使用ftok系统调用生成一个接近唯一的key

IPC对象的引用

使用的基本流程

  • 通过get系统调用创建或打开一个IPC对象
    给定一个整数key,get调用会返回一个整数标识,即IPC标识符

  • 通过这个标识符来引用IPC对象并进行各种操作

  • 通过ctl系统调用获或设置IPC对象的属性、或者删除一个对象

  • IPC对象具有的权限定义在ipc.h头文件中

    下表为system V 各个IPC对象之间的差异

    接口 消息队列 信号量 共享内存
    头文件
    关联数据结构 msqid_ds semid_ds shmid_ds
    创建/打开对象 msgget() semget() shmget()+shmat()
    关闭对象 (无) (无) shmdt()
    控制操作 msgctl() semctl() shmctl()
    执行IPC msgsnd()—写入消息 semop()—测试/调整信号量 访问共享区中的内存

POSIX 和 system V 的对比

  • 编程接口: POSIX接口更简单,使用类似于文件IO的open,write,unlink等;system V接口则比较复杂,不同等ipc对象实际操作都不一样,msgsnd,msgrcv,shmat,shmdt,semop等
    同时POSIX 接口支持异步通信方式,而system V 的通信只能是以阻塞式消耗CPU资源进行通信
  • ipc对象命名:POSIX使用名字来标识IPC对象,system V使用键来管理。
  • 移植性:system V拥有更优的移植性,几乎所有的unix/linux系统都支持system V;POSIX仅仅是unix系统中的一个可选组件,有一些unix系统并不支持,同时linux 2.6之后的系统才开始支持POSIX

POSIX 编程注意事项

  • 使用POSIX 消息队列和共享内存时,需要实时库librt的链接,编译时需要指定-lrt
  • 使用POSIX 信号量时,需要和线程库 libpthread链接起来,编译时需要指定lpthread

你可能感兴趣的:(#,linux操作系统:进程管理)