2009年(41)
分类: LINUX
2009-04-16 11:23:29
咋一看名字,虽然有个socket,但是它的用场和常说的“网络”socket有所不同。它实际上是一种本地IPC,以socket为名是因为它和普通socket使用的接口是一致的。
虽说普通的socket也可以用作本地IPC,但是从效率上和功能上,要逊于Unix Domain Socket。首先,Unix Domain Socket虽然有socket的名,但是它的数据不需要经过网络协议栈处理,而是通过其它的机制,比经过协议栈要快;再次,重要的是,它提供普通socket提供不了的功能----在进程间传递描述符。
进程间传递描述符是个什么概念呢?比如,主机有2个进程A和B,A有一个描述符fd(可以是任意的描述符,文件或socket都可以),那么A可以通过Unix Domain Socket将fd“传”给B,B收到之后,就可以对fd所对应的文件/socket进行操作。第一次听到的时候感觉很神奇!
需要理解的时候,传递描述符并不是指将fd的值传递。将fd传递是没有任何意义的,因为fd只是一个数字代号而已。所谓的传递,其实是在进程B的上下文中打开fd所指的对象(会使对象的引用数加1),因此利用sendmsg发送的fd值,和用recvmsg收到的fd值有可能是不相等的。