Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1495257
  • 博文数量: 148
  • 博客积分: 2234
  • 博客等级: 大尉
  • 技术积分: 3225
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-17 21:34
个人简介

未来很长。

文章存档

2017年(7)

2016年(4)

2015年(1)

2014年(6)

2013年(31)

2012年(99)

分类: LINUX

2012-10-06 20:19:33

IPC我们很清楚它是指进程间的通信,其中有三种我们称之为XSI IPC即消息队列、信号量以及共享存储器,他们之间有好多相似之处。
相似之处:每个内核中的IPC结构都用一个非负整数的标识符加以引用。例如对一个消息队列发送或取消息,只需要知道其队列标识符。与文件标识符不同,IPC标识符不是小的整数,当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整形数的最大正值,然后又回转到0.
标识符是IPC对象的内部名,为使多个合作进程能够在同一IPC对象上会合,需要提供一个外部名方案。为此使用了键,每个IPC对象都与一个键相关连,于是键就用作为该队向的外部名。
无论何时创建IPC结构(调用msgget\semget\shmget),都应指定一个键,键的数据类型是基本系统数据类型key_t,键由内核变换成标识符。
优缺点:IPC结构是在系统范围内起作用的,没有访问计数。例如,如果进程创建了一个消息队列,在该队列中放入了几则消息,然后终止,但是该消息队列及其内容并不会被删除,它们余留在系统中直至出现下述情况:由某个进程调用msgrcv或msgctl读取消息或删除消息队列,或某个进程执行ipcrm命令删除消息队列,或由正在再启动的系统删除消息队列,将此与管道相比,当最后一个访问管道的进程终止时,管道就被完全地删除了。对于FIFO而言,虽然当最后一个引用FIFO进程终止时其名字仍保留在系统中,直至显式地删除它,但是留在FIFO中的数据却在此时被全部删除,于是也就徒有虚名了。
XSI IPC的另一个问题是这些IPC结构在文件系统中没有名字,我们不能使用那些使用文件系统的函数来访问它们或修改他们的属性。为了支持它们不得不增加了十几条全新的系统调用(msgget,semop,shmat).我们不能用ls命令见到IPC对象,不能用rm命令删除他们,不能用chmod命令修改它们的访问权限。于是就不得不增加新的命令ipcs和ipcrm.
因为这些IPC不是用文件描述符,所以不能对他们使用多路转接I/O函数:select和poll。这就使得难于一次使用多个IPC结构,以及在文件或设备I/O中使用IPC结构。例如,没有某种形式的忙--等待循环,就不能使一个服务器进程等待将要放在两个消息队列任一个中的消息。
消息队列的一个其它优点是:可靠,流是可以控制的,面向记录,以非先进先出方式处理。
参见《Unix 高级环境编程》
阅读(5023) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~