1

对于linux上使用fork()的多进程实现程序,socketpair()用于父子进程之间的通信。

在上面的场景中,在进程之间发送辅助数据有什么用?socketpair() 已经提供了父子之间的双向通信。是在 2 个子进程之间共享文件描述符吗?

澄清,

  1. 当我们总是可以使用 socketpair() 连接的套接字来回传递有效负载时,为什么需要辅助数据传递?什么是用例场景?
  2. 我们可以在父进程中创建 pipe() 或 socketpair(),然后 fork 来创建子进程。然后父母和孩子可以通过创建的文件描述符进行通信。辅助数据(通过 unix 套接字)是否有助于两个进程之间的通信?
4

2 回答 2

0

如果不了解您正在检查的软件的设计,这很难说。 socketpair()是一种创建两个套接字连接并将每个描述符传递给另一个进程的简单方法,这样您就可以跳过 bind()、accept()、connect() 代码。

于 2013-03-15T08:20:25.993 回答
0

套接字对是在父子之间传递消息(数据报)或流数据的好方法。但它们绝不是进程间通信 (IPC) 的唯一手段。同一主机上进程的 IPC 机制的其他示例包括:共享内存、信号、锁定文件,甚至 Internet 套接字。特定的应用程序要求和通信的性质(即需要发生多少来回)将决定哪种方法最合适。

您将使用套接字对在两个进程之间交换数据报或流数据。辅助数据函数允许您发送其他无法通信的有趣内容,例如文件描述符。Unix 进程要么在创建它们时继承文件描述符,要么随时使用辅助数据传递它们(参见man cmsgman sendmsg)。

通讯示例:

辅助数据的另一个有用功能是验证连接的远程端(例如:传递凭据)——操作系统可以通过辅助数据告诉您,哪个用户在消息或连接的另一端对等。(诚​​然,当父母和孩子在套接字对的各自末端作为同一个有效用户运行时,后者的用处不大)。

辅助数据允许进程交换在调用 fork() 时还不存在的东西。例如,子工作进程可以在 fork() 之后几分钟创建一个新的临时文件,并使用它在出生时收到的套接字对的一端将其文件描述符传递回父级。然后父进程可以再次将此文件描述符向下传递给不同的子进程。

父级拥有比子级更多的权限也很常见,因此父级中提升的权限可以允许open()在受保护的文件上成功,运行一些不基于 Unix 权限的授权算法,并将描述符传递给子级工人。

要传递辅助数据,您需要事先有某种方式进行通信。我所说的“某种方式”是指任何你可以调用sendmsg()的东西。

示例:通过 Unix 套接字传递文件描述符

于 2018-08-01T03:16:25.833 回答