要表达我的意思,我需要解释一下上下文:
我有一个守护进程,该进程打开posix mq进行通信。客户端与该守护程序位于同一组中,以与其进行通信。客户端还打开posix mq并订阅守护程序。为了能够进行通信,客户端mq必须具有与守护程序可以回答的相同的组。
到目前为止,我设置了客户端设置的gid(chmod g + s客户端)。在基于Qt的桌面(LXQT)上,客户端将启动并按预期工作。在基于gtk +的桌面(树莓派上的名称LXDE)上,它无法启动,因为gtk +阻止了一组uid / gid程序使用其库。
结果,我将mq_open()
的创建提取到设置了gid(chmod g + s)的外部可执行文件中,并使用setegid()
来保存已保存的set gid。
客户端创建一个socketpair()
,fork()
,execve()
,然后将fd通过套接字对(AF_UNIX / SOCK_STREAM)发送到客户端。
我需要满足的要求:
chmod g+s
的安全影响尽可能小。现在我的观点/问题:
我想避免为客户端和守护程序中的mq-opener处理SIGCHLD
和kill()
,wait()
。我只想在readmsg()
上使用socketpair(),如果mq-opener死于任何原因,都会报错。只是不为SIGCHLD编写信号处理程序?
fork()
过程以及与mq-opener的连接非常大。有没有更简单的方法可以做到这一点?
mq-opener(以非特权用户身份启动)可以进行双fork()
并将其父/子连接断开吗?父母/子女关系在什么时候消失?
创建一个只处理mq`s的mq-opener守护程序会更好吗?
更清楚一点:下图:
+-----------+ +------------+
|Daemon | |Client |
+-----------+ +------------+
|File | |File |
|User | |User |
|mqdaemon | |pi |
| | | |
|Group | |Group |
|mqdaemon | |pi |
| | | |
|Rights | +------------+ |Rights |
|a-s | |mq-opener | |a-s |
+-----------+ +------------+ +------------+
|Process | |File | |Process |
|User | |User | |User |
|mqdaemon | |mq-opener | |pi |
| | | | | |
|Group | |Group | |Group |
|mqclients | |mqclients | |pi |
+----+------+ | | +--+---------+
^ | |Rights | | ^
| | |g+s | | |
| | | | | |
| | +------------+ | |
| | fork() |Process | fork() | |
| +------------>|User |<---------+ |
| |(forked) | |
| send_fd() | | send_fd() |
+---------------+|Group |+------------+
|mqclients |
+------------+