当前位置:  技术问答>linux和unix

如何选择Unix IPC

    来源: 互联网  发布时间:2016-11-26

    本文导语:  最初Unix IPC包括:管道、FIFO、信号 System V IPC包括:System V消息队列、System V信号灯、System V共享内存区; Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。 Unix下IPC方式众多,哪几种是现在比较常用的...

最初Unix IPC包括:管道、FIFO、信号
System V IPC包括:System V消息队列、System V信号灯、System V共享内存区;
Posix IPC包括: Posix消息队列、Posix信号灯、Posix共享内存区。

Unix下IPC方式众多,哪几种是现在比较常用的呢?另外分别在何种情形中使用呢?

望有相关开发经验的高手指点一二,尽量详细点,感激不尽!


|
socket 

System V IPC/POSIX IPC
System V IPC包括三种进程通信方式,即消息队列、信号量以及共享存储器,这是一种比较古老的方式,在最近的版本中已逐渐地被POSIX IPC 而取代。当然,两者之间还是有着密切关系的,实现的道理也还是一样。

消息队列、信号量以及共享存储器这三种IPC的几种结构有时又称IPC对象,它不同于前面提到的管道和FIFO。管道和FIFO是基于文件系统的,例如,可在文件系统中看到某一个FIFO类型文件,而System V IPC是基于系统内核的,可以使用命令ipcs来查看系统当前的IPC对象的状态,本节将详细介绍它们各自的特点以及使用实例。

一、IPC对象的概念
由于消息队列、信号量以及共享存储器三种IPC有很多相类似的特性,所以本节将对它们的特性,以及相关知识做一些详细的介绍,IPC对象示意图如图14-7所示。


图14-7  IPC对象的应用示意图

如图14-7所示,IPC对象是活动在内核级别的一种进程间通信的工具。存在的IPC对象通过它的标识符来引用和访问,这个标识符是一个非负整数,它唯一的标识了一个IPC对象,这个IPC对象可以是消息队列或信号量或共享存储器中的任意一种类型。

在Linux系统中标识符被声明成整数,所以可能存在的最大标识符为65535。这里标识符与文件描述符有所不同,使用open函数打开一个文件时,返回的文件描述符的值为当前进程最小可用的文件描述符数组的下标。IPC对象删除或创建时相应的标识符的值会不断增加到最大的值,归零循环分配使用。

IPC的标识符只解决了内部访问一个IPC对象的问题,如何让多个进程都访问某一个特定的IPC对象还需要一个外部键(key),每一个IPC对象都与一个键相关联。这样就解决了多进程在一个IPC对象上汇合的问题。

创建一个IPC对象时需要指定一个键值,类型为key_t,在中定义为一个长整型。键值到标识符的转换是由系统内核来维护的。当有了一个IPC对象的键值,如何让多个进程知道这个键,可以有多种实现的办法。

  ●     可以使用文件来做中间的通道,创建IPC对象进程,使用键IPC_PRIVATE成功建立IPC对象之后,将返回的标识符存储在一个文件中。其他进程通过读取这个标识符来引用IPC对象通信。

  ●     定义一个多个进程都认可的键,每个进程使用这个键来引用IPC对象,值得注意的是,创建IPC对象的进程中,创建IPC对象时如果该键值已经与一个IPC对象结合,则应该删除该IPC对象,再创建一个新的IPC对象。

  ●     多进程通信中,对于指定键引用一个IPC对象而言,可能不具有拓展性,并且在该键值已经被一个IPC对象结合的情况下。所以必须删除这个存在对象之后再建立一个新的。这有可能影响到其他正在使用这个对象的进程。函数ftok可以在一定程度上解决这个问题,

函数ftok可以使用两个参数生成一个键值,函数原型如下:

#include 

key_t ftok( const char *path, int id );

函数中参数path是一个文件名。函数中进行的操作是,取该文件的stat结构的st_dev成员和st_ino成员的部分值,然后与参数ID的第八位结合起来生成一个键值。由于只是使用st_dew和st_ino的部分值,所以会丢失信息,不排除两个不同文件使用同一个ID,得到同样键值的情况。

系统为每一个IPC对象保存一个ipc_perm结构体,该结构说明了IPC对象的权限和所有者,每一个版本的内核各有不用的ipc_perm结构成员。若要查看详细的定义请参阅文件。

struct ipc_perm {
    key_t key;
    uid_t uid;
    gid_t gid;
    uid_t cuid;
    gid_t cgid;
    unsigned short mode;
    unsigned short seq;
};

每一种版本的ipc_perm结构体定义至少要包含上述几个域。当调用IPC对象的创建函数(semget msgget shmget )时,会对ipc_perm结构的每一个域赋值。在后续的操作中如需修改这几个域则调用相应的控制函数(msgctl semctl shmctl)。

%注意:只有超级用户或者创建IPC对象的进程有权改变ipc_perm结构的值。结构中的mode域类似于文件的stat结构的mode域,但是不可以有执行权限。mode值描述如表14-3所示。

表14-3  ipc_perm的mode详解表

操作者

写(更改 更新)
操作者

写(更改 更新)
用户
0400
0200
其他
0004
0002
  组
0040
0020
二、IPC对象的问题
IPC对象所存在的问题主要集中在以下几点:

过于繁杂的编程接口,比起使用其他通信方式,IPC所要求的代码量要明显增多。

  ●     IPC不使用通用的文件系统,这也是饱受指责的原因。所以不能使用标准I/O操作函数来读写IPC对象。为此不得不新增加一些函数来支持必要的一些操作(例如msgget msgrev msgctl等)并且对于不同类型的IPC对象都有一系列特定的操作函数。由于IPC不使用文件描述符,所以不能使用多路I/O监控函数select及poll函数来操作IPC对象。

  ●     缺少的资源回收机制。由于IPC对象在使用过程中并不保存引用计数,所以当出现一个进程创建了IPC对象然后退出时,则这个对象只有在出现后面几种情况才会被释放或者删除,即由某一个进程读出消息,或者IPC的所有者或超级用户删除了这个对象。这也是IPC相对于管道或FIFO所欠缺的资源回收机制。

三、IPC对象系统命令
在shell下可以使用一些命令来操作IPC对象,下面通过几个实际的例子来帮助理解IPC对象,使用ipcs可以显示IPC的状态。在shell中输入:

$ipcs –a

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status

0x00000000 65536      root      600        393216     2          dest

0x00000000 2654209    root      666        4096       0

0x00000000 2752516    root      666        4096       0

------ Semaphore Arrays --------

key        semid      owner      perms      nsems

0x00000000 294911     root      666        1

------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages

注意ipcs输出的信息中的key 以及shmid,key标识的是IPC对象的外键,shmid标识的IPC对象的标识符。owner标识的是IPC所属的用户,perms标识权限。可以使用ipcrm命令来删除一个IPC对象,使用实例如下。在shell中输入:

$ipcrm –m 2752516

$ipcs –a

------ Shared Memory Segments --------

key        shmid      owner      perms      bytes      nattch     status

0x00000000 65536      root      600        393216     2          dest

0x00000000 2654209    root      666        4096       0

------ Semaphore Arrays --------

key        semid      owner      perms      nsems

0x00000000 294911     root      666        1

------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages

在应用中,如果使用kill命令删除程序后,发现系统资源例如内存的使用量仍然很高,则应检查系统IPC状态,并使用ipcrm命令删除不使用的IPC。

|
资料网上好多,怎么用看你。
每种IPC都自己亲自实现一次,以后就熟悉了。比如某些IPC没有文件描述符,就不能跟select合用。

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 请教:solaris下如何打印文件,需要支持选择纸张类型和选择黑白彩色!
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 怎样使文件选择器可以选择多个文件?
  • CSS 2和CSS 3选择器详解
  • 在选择gone为默认图形界面后如何选择kde?
  • 我在安装 redhat7.2 的时候选择了 GNOME 界面,启动的时候选择了图形界面启动,请问如何更改?
  • 各位能不能说选择Linux不选择Windows的理由?
  • 编译了lilo之后,重启到选择哪个系统的时候,不是原来的选择画面,我想改回去,如何改
  • Jqgrid设置全选(选择)及获取选择行的值示例代码
  • vim块选择,可以用长方形的方式选择数据:ctrl+v怎么没有效果呢。我是linux环境的。
  • **** 高分, 请问在Java中如何做一个文件选择对话框和目录选择对话框? ***
  • CPU如何知道CS寄存器内装的是LDTR指向的描述符表的段选择符还是GDTR指向的描述符表的段选择符呢?
  • 请教linux下的编程的选择:我听说有gtk+gnome的编程,也有kde里的 什么编程,到底应该选择哪个呢?好象一个是技术好一点,一个是市场占有
  • 请问如何保存住下拉框的选项的结果值,比如时间的选择或者任意选项的选择
  • jquery选择器之内容过滤选择器详解
  • 痛哭!!!装了共创桌面后,因为分割了一个分区,导致无法进入系统选择菜单,把共创格式化后,重装原来的windows都无法进入系统选择菜单
  • 请教我先前装了Windows Server 2003,再装Ret Hat Linux 9,开机时,会提示选择操作系统,现在我重装Window Serever 2003,开机不会提示选择
  • 想知道该如何设置才能使 netterm 进行自动登录 ?我查了资料,但无果。 有人给我答案:{不要输入用户名和密码的那种功能?选择地址簿-〉选择登录巨集文件(我用的是中文版,不知道是谁翻得这么烂)。选一个类似的文件改改就是了。}我还是不明白如何操作 ?
  • jquery选择器之属性过滤选择器
  • 有一个疑问,在jsp的页中有一个选择文件的<input type="file" name="upload_file_name">,当我选择了本地的一个文件的时候,按下提交,提


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3