IPC对象 百科内容来自于: 百度百科

IPC对象的概念

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

ipc的概念

创建一个IPC对象时需要指定一个键值类型为key_t在<sys/types.h>中定义为一个长整型键值到标识符的转换是由系统内核来维护的当有了一个IPC对象的键值如何让多个进程知道这个键可以有多种实现的办法
● 可以使用文件来做中间的通道创建IPC对象进程使用键IPC_PRIVATE成功建立IPC对象之后将返回的标识符存储在一个文件中其他进程通过读取这个标识符来引用IPC对象通信
● 定义一个多个进程都认可的键每个进程使用这个键来引用IPC对象值得注意的是创建IPC对象的进程中创建IPC对象时如果该键值已经与一个IPC对象结合则应该删除该IPC对象再创建一个新的IPC对象
多进程通信中对于指定键引用一个IPC对象而言可能不具有拓展性并且在该键值已经被一个IPC对象结合的情况下所以必须删除这个存在对象之后再建立一个新的这有可能影响到其他正在使用这个对象的进程函数ftok可以在一定程度上解决这个问题
函数ftok可以使用两个参数生成一个键值函数原型如下
#include <sys/ipc.h>
key_tftok( const char *path, int id );
函数中参数path是一个文件名函数中进行的操作是取该文件的stat结构的st_dev成员和st_ino成员的部分值然后与参数ID的第八位结合起来生成一个键值由于只是使用st_dew和st_ino的部分值所以会丢失信息不排除两个不同文件使用同一个ID得到同样键值的情况
系统为每一个IPC对象保存一个ipc_perm结构体该结构说明了IPC对象的权限和所有者每一个版本的内核各有不用的ipc_perm结构成员若要查看详细的定义请参阅文件<sys/ipc.h>
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对象的创建函数semgetmsggetshmget 时会对ipc_perm结构的每一个域赋值在后续的操作中如需修改这几个域则调用相应的控制函数msgctlsemctl shmctl
%注意只有超级用户或者创建IPC对象的进程有权改变ipc_perm结构的值结构中的mode域类似于文件的stat结构的mode域但是不可以有执行权限mode值描述如表14-3所示
ipc_perm的mode详解表
操作者
写更改 更新
操作者
写更改 更新
用户
0400
0200
其他
0004
0002
0040
0020

IPC对象的问题

IPC对象所存在的问题主要集中在以下几点
过于繁杂的编程接口比起使用其他通信方式IPC所要求的代码量要明显增多
● IPC不使用通用的文件系统这也是饱受指责的原因所以不能使用标准I/O操作函数来读写IPC对象为此不得不新增加一些函数来支持必要的一些操作例如msggetmsgrevmsgctl等并且对于不同类型的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 以及shmidkey标识的是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
$firstVoiceSent
- 来自原声例句
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定