如何在命名管道

时间:2016-06-01 09:22:26

标签: c linux named-pipes file-descriptor

我的目标是为守护进程创建一个概念,该守护进程在本地(即不通过网络)与其他进程交互,所有进程都具有不同的用户ID /权限。

要限制对具有正确访问级别的进程的守护程序的访问,我将遵循以下概念:

  • 每个守护程序都会打开一个命名管道,以便在/foo/{daemon-name}
  • 中阅读
  • 可以通过正常的文件访问权限轻松管理对该命名管道的访问,因此不在正确用户组中的其他进程将无法对管道进行写入访问
  • 以后可以轻松更改守护程序的访问权限,而无需重新编译
  • 想要与守护进程通信的进程通过命名管道发送socketpair()的一端,并通过该链接继续通信

这样,每个dameon都可以实现自己的API或数据包格式,通过socketpair进行通信。但是不需要身份验证,因为对命名管道的访问权限已经只处理了能够发送socketpair进行通信的特定组。

现在唯一的问题是我无法转移socketpair()文件descritor来处理命名管道。 sendmsg()显然不适用于命名管道。

如何通过命名管道发送一个socketpair() fds,以便守护程序可以访问连接并开始通信?

1 个答案:

答案 0 :(得分:1)

命名管道不适用于您想要执行的操作 - 管道不保留有关其中数据来源的信息。它是原始数据位的管道,而不是像插槽这样的连接,它保留了有关数据来源和位置的更多信息。

Unix域套接字和命名管道不一样 - 它们具有不同的功能。 Unix域套接字可用于在进程之间发送文件描述符,命名管道不能。 为什么以这种方式实施它们是另一个问题。

由于您正在尝试在守护程序和客户端进程之间创建套接字连接,因此只需使用Unix域套接字即可直接获得此类连接。文件系统权限与Unix域套接字一样,就像命名管道一样。