套接字对是在父子之间传递消息(数据报)或流数据的好方法。但它们绝不是进程间通信 (IPC) 的唯一手段。同一主机上进程的 IPC 机制的其他示例包括:共享内存、信号、锁定文件,甚至 Internet 套接字。特定的应用程序要求和通信的性质(即需要发生多少来回)将决定哪种方法最合适。
您将使用套接字对在两个进程之间交换数据报或流数据。辅助数据函数允许您发送其他无法通信的有趣内容,例如文件描述符。Unix 进程要么在创建它们时继承文件描述符,要么随时使用辅助数据传递它们(参见man cmsg
和man sendmsg
)。
通讯示例:
辅助数据的另一个有用功能是验证连接的远程端(例如:传递凭据)——操作系统可以通过辅助数据告诉您,哪个用户在消息或连接的另一端对等。(诚然,当父母和孩子在套接字对的各自末端作为同一个有效用户运行时,后者的用处不大)。
辅助数据允许进程交换在调用 fork() 时还不存在的东西。例如,子工作进程可以在 fork() 之后几分钟创建一个新的临时文件,并使用它在出生时收到的套接字对的一端将其文件描述符传递回父级。然后父进程可以再次将此文件描述符向下传递给不同的子进程。
父级拥有比子级更多的权限也很常见,因此父级中提升的权限可以允许open()
在受保护的文件上成功,运行一些不基于 Unix 权限的授权算法,并将描述符传递给子级工人。
要传递辅助数据,您需要事先有某种方式进行通信。我所说的“某种方式”是指任何你可以调用sendmsg()
的东西。
示例:通过 Unix 套接字传递文件描述符