System V IPC 包括三种进程间通信方式:消息队列+信号量(又叫信号灯)+共享内存。
这三种IPC的几种结构又称为IPC对象,不同于管道和FIFO,管道和FIFO是基于文件系统的。在文件系统中可以看到某一个FIFO类型文件,但System V IPC是基于系统内核的,可以使用命令ipcs查看系统当前的IPC对象的状态。
1.IPC对象的概念
IPC对象是活动在内核级别的一种进程间通信的工具,存在的IPC对象通过它的标识符来引用和访问,这个标识符是一个非负整数,它唯一的标识了一个IPC对象,这个IPC对象可以是三种类型中的任一种。
IPC标识符与文件描述符不同,使用open函数打开一个文件时,返回的文件描述符的值为当前进程最小可用的文件描述符数组的下标。IPC对象删除或创建时相应的标识符的值会不断增加大最大的值,归零循环分配使用。linux系统中标识符被声明为整数,所以可能存在的最大标识符为65535.
IPC的标识符只解决了内部访问一个IPC对象的问题,如何让多个进程都访问某一个特定的IPC对象还需要一个外部键(key),每一个IPC对象都于一个键相关联。这样就解决了多进程在一个IPC对象上汇合的问题。
创建一个IPC对象时需要指定一个键值,类型为key_t,在中定义为一个长整型。键值到标识符的转换是由系统内核来维护的。当有了一个IPC对象的键值时,如何让多个进程知道这个键,有多种方法实现。
2.IPC对象的系统命令
在shell下可以使用一些命令来操作IPC对象,
#ipcs -a
- ------ Shared Memory Segments --------
- key shmid owner perms bytes nattch status
- 0x00000000 65536 root 600 393216 2 dest
- 0x00000000 98305 root 600 393216 2 dest
- 0x00000000 131074 root 600 393216 2 dest
- 0x00000000 163843 root 600 393216 2 dest
- 0x00000000 196612 root 600 393216 2 dest
- 0x00000000 229381 root 600 393216 2 dest
- 0x00000000 262150 root 600 393216 2 dest
- 0x00000000 294919 root 600 393216 2 dest
- 0x00000000 327688 root 600 393216 2 dest
- 0x00000000 360457 root 600 393216 2 dest
- 0x00000000 393226 root 600 393216 2 dest
- ------ Semaphore Arrays --------
- key semid owner perms nsems
- ------ Message Queues --------
- key msqid owner perms used-bytes messages
输出三种类型的IPC对象,共享内存,信号量,消息队列
key是IPC对象的外键,shmid标识的IPC对象的标识符。owner表示IPC所属的用户,perms表示权限。
可以使用命令ipcrm 删除一个IPC对象;
#ipcrm -m 393226
阅读(214) | 评论(0) | 转发(0) |