如何通过命名管道传输文件描述符
How can I transfer a filedescriptor over a named pipe
我的目标是为在本地(即不通过网络)与其他进程交互的守护进程创建一个概念,所有进程都与不同的用户 ids/rights。
为了将对守护进程的访问限制为具有正确访问级别的进程,我采用了以下概念:
- 每个守护进程打开一个命名管道用于读取
/foo/{daemon-name}
- 可以通过普通文件访问权限轻松管理对该命名管道的访问,因此不在正确用户组中的其他进程将没有对该管道的写入权限
- 稍后更改对守护程序的访问权限很容易完成,无需重新编译
- 一个想要与守护进程通信的进程通过命名管道发送
socketpair()
的一端,通信继续通过 link
这样,每个 dameon 都可以实现自己的 API 或数据包格式以通过套接字对进行通信。但是不需要身份验证等,因为对命名管道的访问权限已经处理了只有特定组能够发送套接字对进行通信。
现在我遇到的唯一问题是我无法传输 socketpair()
文件描述符以在命名管道上工作。
sendmsg()
显然不适用于命名管道。
如何通过命名管道发送 socketpair()
fds 之一,以便守护程序可以访问连接并开始通信?
命名管道无法满足您的需求 - 管道不保留有关其中数据来源的信息。它是用于原始数据位的管道,而不是像套接字那样的连接,它保留了有关数据来自何处和去往何处的更多信息.
Unix 域套接字和命名管道不同——它们具有不同的功能。 Unix 域套接字可用于在进程之间发送文件描述符,命名管道则不能。 为什么他们以这种方式实施是另一个问题。
由于您试图在守护进程和客户端进程之间创建套接字连接,因此只需使用 Unix 域套接字直接获得此类连接。文件系统权限与 Unix 域套接字一起使用,就像它们对命名管道所做的一样。
我的目标是为在本地(即不通过网络)与其他进程交互的守护进程创建一个概念,所有进程都与不同的用户 ids/rights。
为了将对守护进程的访问限制为具有正确访问级别的进程,我采用了以下概念:
- 每个守护进程打开一个命名管道用于读取
/foo/{daemon-name}
- 可以通过普通文件访问权限轻松管理对该命名管道的访问,因此不在正确用户组中的其他进程将没有对该管道的写入权限
- 稍后更改对守护程序的访问权限很容易完成,无需重新编译
- 一个想要与守护进程通信的进程通过命名管道发送
socketpair()
的一端,通信继续通过 link
这样,每个 dameon 都可以实现自己的 API 或数据包格式以通过套接字对进行通信。但是不需要身份验证等,因为对命名管道的访问权限已经处理了只有特定组能够发送套接字对进行通信。
现在我遇到的唯一问题是我无法传输 socketpair()
文件描述符以在命名管道上工作。
sendmsg()
显然不适用于命名管道。
如何通过命名管道发送 socketpair()
fds 之一,以便守护程序可以访问连接并开始通信?
命名管道无法满足您的需求 - 管道不保留有关其中数据来源的信息。它是用于原始数据位的管道,而不是像套接字那样的连接,它保留了有关数据来自何处和去往何处的更多信息.
Unix 域套接字和命名管道不同——它们具有不同的功能。 Unix 域套接字可用于在进程之间发送文件描述符,命名管道则不能。 为什么他们以这种方式实施是另一个问题。
由于您试图在守护进程和客户端进程之间创建套接字连接,因此只需使用 Unix 域套接字直接获得此类连接。文件系统权限与 Unix 域套接字一起使用,就像它们对命名管道所做的一样。