IPC标识符和客户端/服务器应用程序

在客户端/服务器应用程序中,服务器通常会创建System v IPC对象,而客户端仅仅是需要访问他们。换句话说,服务器在执行get调用时需要制定IPC_CREATE标记,而客户端在get调用中则会省略这个标记。
假设一个客户端参与了一个服务器测延伸会话,其中每个进程会执行多个IPC操作(如交换多条消息,一组信号量操作,或者多次更新共享内存)。如果服务器崩溃,或者故意停止然后重启会发生什么情况呢,这时,盲目的重用由前一个服务器进程创建的IPC对象是毫无意义的,因为新服务器进程不清楚与IPC对象的当前状态相关的历史信息(如消息队列中客户端因响应老的服务器进程之前发送的一条消息而发出的第二条请求)
在这种情况下,服务器唯一可做的事情就是丢弃所有既有的客户端、删除由上一个服务器进程创建的IPC对象,创建IPC对象新实例,。新启动的服务器首先会通过在get调用中同时指定IPC_CREAT和IPC_EXCL标记创建一个IPC对象来处理服务器的上一个实例非正常终止的情况。
尽管重新启动的服务器会重新创建IPC对象,但如果再创建新IPC对象时将同样的key传递给get调用,那么总是会生成同样的标识符,我们可以从客户端的角度思考下这个问题的解决方案,如果服务器重新创建的IPC对象使用了同样的标识符,那么客户端就不知道服务器已经重启并且IPC对象已经不包含预期的历史信息了,
note:为解决这个问题,内核采用了一个算法(下一节描述)通常能够确保再创建新IPC对象时,对象会得到一个不同的标识符,即使传入的key是一样的。其结果是所有与老的服务器进程链接的客户端在使用旧的标识符时会从相关的IPC系统调用中收到一个错误
对于get所使用的算法需要注意一下几点:
即使使用相同的key创建了一个新IPC对象,也几乎可以肯定对象被分配到的标识符是不同的,因为标识符的计算是根据保存在关联数据结构中的seq字段来进行的,而在同种类型的对象的创建过程中都会递增这个值
用于表示 System V IPC (信号量)对象的数据结构

ipcs和ipcrm命令

ipcs和ipcrm命令是类似于ls和rm文件命令的命令。使用ipcs能够获取系统上IPC对象的信息。在默认情况下ipcs会显示出所有对象
2,ipcrm会删除一个IPC对象
ipcrm -x key/id
在上面给出的命令中既可以将一个IPC对象的key指定为参数key,也可以将一个IPC对象指定为参数id并且使用小写的x替换其大写形式或使用小写的q(用于消息队列)或s(用于信号量)或m(用于共享内存)。因此使用下面的命令可以删除标识符为65538的信号量集
ipcrm -s 65538。

总结

  • System V IPC 是首先在System V中 被广泛使用的三种IPC机制的名称并且之后被移植到了大多数unix实现中以及被加入了各种标准中。这三种IPC机制允许进程之间交换消息的消息队列,,允许进程同步对共享资源的访问的信号量。以及允许两个或者更多进程共享的同一个页的共享内存
  • 这三种IPC机制在API语义上存在许多相似之处。对于每种IPC机制来讲,get系统调用huichuangjian-或打开一个对象,给定一个整数key个体调用返回一个整数标识符用来在后续的系统调用中引用该对象,每种IPC机制还用于一个对应的ctrl调用来删除一个对象以及获取和修改对象关联的数据结构的相关特性(如所有权和权限)
  • 用来为新IPC对象对象生成标识符的算法被设计成将(立即)复用同样的标识符的可能性讲到最低,即使相应的对象已经被删除了,甚至是使用同样的key来创建新对象也一样。这样客户端-服务器应用程序就能正常工作了–重新启动的服务器进程能够检测并删除上一个服务器进程创建的IPCA对象,并且这个动作会另上一个服务器进程的客户端所保存的标识符失效。
  • 在linux上,/proc/sysvipc目录中的文件可以用来获取系统上所有的IPC对象的信息。
  • 每种IPC机制都有一组相关的限制,他们通过组织创建任意数量的IPC对象来避免系统资源的耗尽。/proc/sys/kernel目录中的各个文件来查看和修改这些限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值