Sysytem V IPC介绍

System V IPC 包括三种不同的进程间通信机制

  • 消息队列用来进程之间传递消息。消息队列与管道有点像,但是两者存在重大差别。第一是消息队列是存在边界的,这样读者和写者之间以消息进行通信,而不是通过无分割符的字节流进行通信的。第二是,每条消息包括一个整型字段的type字段,并且可以通过类型选择消息,无需已消息写入的顺序来读取消息

  • 信号量允许多个进程同步他们的动作。一个信号量是一个由内核维护的整数值,他对所有具备相应权限的进程可见,一个进程通过对信号量的值进行修改来通知其他进程正在执行某个动作。

  • 共享内存使得多个进程之间能够共享内存(即同辈映射到多个进程的虚拟内存的页帧)的同一块区域,由于访问用户空间的内存的操作是非常快的,因此共享内存是其中一种速度最快的IPC方法,一个进程一旦更新了共享内存,那么这个变更就会对共享同一个内存的 其他进程剋见
    4.1 创建和打开一个System V IPC对象
    每种System V IPC 机制都有一个相关的get系统调用(msgget() semget()或者shmget()),他与文件上的open系统调用类似。给定一个整数key(类似于文件名),get调用完成下列某个操作

  • 使用给定的key创建一个新IPC对象并返回一个唯一的标识符来表示该对象

  • 返回一个拥有给定的key的既有IPC对象的标识符

  • IPCA描述符与文件描述符类似,在后续所有引用该IPC对象的系统调用都修要用到它。但是这两者之间存在一个重要语义上的差别,文件描述符是一个进程特性。而IPC标识符是对象本身的一个属性,并且对系统全局可见。所有访问同一对象的进程使用同样的标识符,这意味着如果指导一个IPC对象已存在 那么可以跳过get调用,只要能够通过魔种机制获知对象的标识符即可。 例如创建对象的进程可能会将标识符写入一个可供其他进程读取的文件

  • `id = msgget(key,IPC_CREAT|S_IRUSR|S_IWUSR);
    与所有的get调用一样,key是第一个参数。标识符是返回的结果,传递给get调用的最后一个参数(flags)使用与文件一样的掩码常量制定了对象上的权限,上面例子只给对象的所有者赋予了读取和写入消息的权限,所有访问同一个IPC对象的进程在执行get调用时会指定同样的key以获取该对象同样的一个标识符

*IPC对象删除和对象持久

**
各种Syatem V IPC机制的ctrl调用(msgctrl(),shmctrl(),semctrl())在对象上执行一组控制操作,其中很多控制操作适用于某种IPC机制,有些是适用于所有的IPC机制的,其中一个就是IPC_RMID操作,它可以用来删除一个对象:

shmctrl(id,IPC_RMID,NULL);

对于消息队列和信号量来讲,IPC对象的删除时立即生效的,对象中包含的所有信息都会被销毁,不管是否有其他进程仍然在使用该对象,共享内存对象的删除操作是不同的,在调用上述函数之后,只有当所有使用该内存段的进程与该内存段分离之后(使用shmdt)才会删除该共享内存段。
System V IPC对象具备内核持久性,一旦被创建之后,一个对象就会一直存在直到它被显式的删除或者系统关闭。 System V IPC这个属性是非常有用的,因为一个进程可以创建一个对象,修改其状态然后退出并是得在后面某个时刻启动的进程可以访问这个对象但是这种属性也有缺点:

  1. 系统对每种类型的IPC对象都是有限制的,如=如果没有删除有不用的对象,那么应用程序可能会因达到这个限制额发生错误
  2. 在删除一个消息队列或信号量对象时,多进程应用程序可能难以确定那个进程是最后一个需要访问对象的进程。从而导致难以确定何时可以安全的删除对象,这里的问题是这些对象是无连接的-----内核不会记录那个进程打开了对象。(共享内存段不会出现该问题因为他们删除的语义不同)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值