Linux进程间通信_IPC机制的深入理解2

来源:互联网 发布:js every 编辑:程序博客网 时间:2024/05/18 00:42

    内核中每个IPC结构都有一个非负整数的标识符。但是多个进程利用IPC机制进行进程间的通信都是通过找到相同的IPC对象的键值就可以达到多个进程之间通过对同一个信号量, 消息队列,共享内存中的数据进行操作,这样多个进程就能够进行通信了。

那么标识符和键(key)的作用

    标识符:用来标识每个IPC结构。例如一台主机上现在有3个消息队列,则为了区分每个消息队列就用标识符对其进行标记。(这里的标识符与描述符不同,文件描述符通常是从3开始递增的,但是标识符不是一个很小的整数,通常数值比较大,可以通过ipcs命令来查看IPC结构的信息)。

    键(key)如果多个进程要利用同一个IPC结构进行通行,就可以利用键(key)来对同一个IPC结构进行操作。键的数据类型为key_t实质上是个长整型在头文件<sys/types.h>中。键是由路径名+项目ID(0到255之间的字符值)通过ftok()函数形成的。

    通常情况下我们称标识符为内部名,键为外部名。因为用户进程只能找到键,然后内核将键转换成标识符。标识符命名在内核中。

IPC结构的特点:

    (1)IPC结构都不存在执行权限,在内核中的ipc_perm{}这个结构体用来标记权限,另外消息队列,共享内存对权限使用的术语为“读”,“写”,而信号量对权限使用的术语为“读”,“更改”。

    (2)IPC结构是随内核的,不是随进程的,并且没有引用计数,(但是信号量是有引用计数的)的就是说IPC结构不会因为进程的结束而消失,管道和有名管道都是随进程的,当最后一个引用管道的进程结束后,管道就被删除。但是IPC结构不会。那么如果要删除IPC结构就得用**ctl()函数,或者ipcrm命令。

       (3)IPC结构在文件系统中没有名字,所以不能利用对文件的操作来操作IPC结构,例如不能用chmod来修改IPC结构的属性,因此增加几个新的系统调用**ctl(), semop(), shmat(),不能用ls命令查看IPC对象,不能用rm删除,为了支持IPC对象增加了几个新的命令ipcs, ipcrm

    (4)IPC结构使用标识符,不使用文件描述符,因此不能结合使用Sselect, poll, epoll等这些多路转接I/O函数。因为iIPC结构很难一次使用一个以上的IPC结构,或者在文件和I/O设备中使用IPC结构。

     (5)IPC结构进行数据通信是可靠的,因为IPC机制只能用于一台主机上多个进程之间的通信,所以不用考虑数据丢失的问题。

0 0