对于使用fork()的linux上的多进程实现程序,socketpair()用于父进程和子进程之间的通信。
在上述场景中,在进程之间发送辅助数据有什么用? socketpair()已经提供了父和子之间的双向通信。它是在两个子进程之间共享文件描述符吗?
澄清,
答案 0 :(得分:0)
如果不了解您正在检查的软件的设计,很难说。
socketpair()
是一种简单的方法来创建两个套接字的连接,并将每个描述符传递给另一个进程,这样就可以跳过bind(),accept(),connect()代码。
答案 1 :(得分:0)
套接字对是在父子之间传递消息(数据报)或流数据的好方法。但是,它们绝不是进程间通信(IPC)的唯一手段。用于同一主机上进程的IPC机制的其他示例包括:共享内存,信号,锁文件,甚至是Internet套接字。特定的应用程序要求和通信的性质(即需要多少来回通信)将决定哪种方法最合适。
您将使用套接字对在两个进程之间交换数据报或流数据。辅助数据功能使您可以发送其他您无法交流的有趣事物,例如文件描述符。 Unix进程要么在创建文件时继承文件描述符,要么在任何时候使用辅助数据传递它们(请参阅man cmsg
和man sendmsg
)。
通信示例:
辅助数据的另一个有用功能是验证连接的远端(ex: passing credentials)-操作系统可以通过辅助数据告诉您哪个用户在消息或连接的另一端被对等。 (诚然,当父母和孩子在套接字对的各自末端以相同的有效用户身份运行时,后者的作用较小。
辅助数据允许进程交换在调用fork()时尚不存在的事物。例如,一个童工进程可以在fork()之后几分钟创建一个新的临时文件,并使用它在出生时收到的套接字对的一端将其文件描述符传递回父级。然后,父级可以再次将此文件描述符传递给另一个子进程。
父级比子级拥有更多的权限也很常见,因此,父级中较高的特权可以使open()
在受保护的文件上成功运行一些不基于Unix权限的授权算法,并将描述符传递给童工。
要传递辅助数据,您需要预先进行某种通信。所谓“某种方式”,是指您可以调用sendmsg()
的任何内容。