SO_PEERCRED是获取连接的AF_UNIXstream套接字的pid / uid / gid的简单方法,SCM_CREDENTIALS或多或less是相同的,但更复杂(各种辅助消息)。 示例显示了两种方式的链接 。
我应该使用什么?
如果我理解正确,两者之间有一个微妙的差别。 SO_PEERCRED
检索对等进程的凭证,而不需要来自对等进程的任何交互。 相反, SCM_CREDENTIALS
是发送/接收对等进程凭证的机制,然后由内核检查。 当一个进程作为UID 0运行时,这种细微的差别可能很重要SCM_CREDENTIALS
允许一个进程作为UID 0运行,声明自己没有特权(例如,UID 50),而这对于SO_PEERCRED
是不可能的。
往上看。 我想鼓励使用SCM_CREDENTIALS
,而SO_PEERCRED
仅支持兼容性。
dbus守护进程似乎使用SO_PEERCRED
和getpeereid()
。 我认为最好是复制他们的代码,以便可移植地获取凭据。
SO_PEERCRED
返回套接字对等的凭证。 SCM_CREDENTIALS
允许您传递您有权享有的任何凭据。 这是特别有价值的,因为内核会翻译id,所以一个pid命名空间中的任务可以发送一个pid来在另一个命名空间中处理,并确保接收到的pid将引用它所期望的相同进程。
如果你想要对方的凭证,那么使用SO_PEERCRED
。 SCM_CREDENTIAL
是调用者指定的凭证(它必须具有权限),而不一定是对等的凭证。