是否可以使用Go通过Unix域套接字发送和接收文件描述符?
在unix域套接字的是否可以使用Go通过Unix域套接字发送和接收文件描述符?,unix,go,unix-socket,Unix,Go,Unix Socket,在unix域套接字的unix(7)手册页中,它说sendmsg可以与SCM\u RIGHTS标志一起使用,通过这些套接字发送文件描述符。Go是否支持此功能?有没有什么好的示例代码来说明它是如何完成的 似乎在syscall包中声明了一个。但是没有函数可以接受它。也许我必须使用原始系统调用接口?这里有一个包可以这样做:。然而,这是使用Syscall包来实现的。我不确定是否有办法用Go标准库API实现这一点 在syscall包中,要查看的内容有UnixRights、ParseUnixRights和Pa
unix(7)
手册页中,它说sendmsg
可以与SCM\u RIGHTS
标志一起使用,通过这些套接字发送文件描述符。Go是否支持此功能?有没有什么好的示例代码来说明它是如何完成的
似乎在
syscall
包中声明了一个。但是没有函数可以接受它。也许我必须使用原始系统调用接口?这里有一个包可以这样做:。然而,这是使用Syscall包来实现的。我不确定是否有办法用Go标准库API实现这一点
在syscall
包中,要查看的内容有UnixRights
、ParseUnixRights
和ParseSocketControlMessage
。它们可以与Readmsg
和Sendmsg
一起使用,通过AF_UNIX套接字发送文件描述符
接收的基本结构如下所示:
buf := make([]byte, syscall.CmsgSpace(<number of file descriptors expected> * 4))
_, _, _, _, err = syscall.Recvmsg(socket, nil, buf, 0)
if err != nil {
panic(err)
}
var msgs []syscall.SocketControlMessage
msgs, err = syscall.ParseSocketControlMessage(buf)
var allfds []int
for i := 0, i < len(msgs) && err == null; i++ {
var msgfds []int
msgfds, err = syscall.ParseUnixRights(&msgs[i])
append(allfds, msgfds...)
}
这对我来说已经足够了。我正在做的这整件事是非常特定于Linux的。我甚至不得不努力避免它成为x86_64特定的。这是唯一的权利。它应该适用于任何实现POSIXAPI的东西,允许这种事情。如果你不介意的话,我将把真正的答案编辑到你的答案中。谁知道你链接到的代码是否会永远存在?
rights := syscall.UnixRights(fds...)
err := syscall.Sendmsg(socket, nil, rights, nil, 0)