Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以使用Go通过Unix域套接字发送和接收文件描述符?_Unix_Go_Unix Socket - Fatal编程技术网

是否可以使用Go通过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域套接字的
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)