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