2012年5月28日星期一

Linux下传送文件描述符的几个问题

这两日仍抽空忙于项目的设计开发,遇到了两个关于Linux下传送文件描述符的问题,记录如下:

1. Linux不支持类似SystemV的流管道传递文件描述符(即非FIFO/tcp socket等),只支持通过UnixSocket方式。目前只有类似Solaris的系统支持前者。

   不得已,修改了arch中相关代码,单独打开了一对UnixSocket专用于文件描述符传送。

2. 64位系统下,接受文件描述符侧进程在recvmsg调用返回后结构struct msghdr变量中msg_controllen大小较结构struct cmsghdr变量中cmsg_len大4个字节;在32位系统下两者相等。

    在64位系统只传送1个文件描述符的情况下,前者大小为24字节而后者20字节。若按照APUE中代码的判断规则则是失败的,按照UNP中则可以通过。(Ubuntu 64/32)

尤其是后一问题,折腾了许久才发现32位与64位的不同,目前参考UNP修改了判断语句以规避此问题,后续有时间的话还需要对原因进一步探讨。

没有评论:

发表评论