Es gibt ein Paket, das es hier tut: https://github.com/ftrvxmtrx/fd/blob/master/fd.go. Dies wird jedoch mithilfe des Syscall-Pakets erreicht. Ich bin mir nicht sicher, ob es eine Möglichkeit gibt, dies mit der Go-Standardbibliothek-API zu tun.
Im syscall
Paket, um die Dinge zu sehen sind UnixRights
, ParseUnixRights
und ParseSocketControlMessage
. Diese können in Verbindung mit Readmsg
und Sendmsg
verwendet werden, um Dateideskriptoren über AF_UNIX-Sockets zu senden.
Die Grundstruktur geht so etwas für den Empfang:
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...)
}
Und für das Senden, ist es viel einfacher (var fds []int
):
rights := syscall.UnixRights(fds...)
err := syscall.Sendmsg(socket, nil, rights, nil, 0)
Das ist für mich gut genug. Diese ganze Sache, an der ich arbeite, ist extrem Linux-spezifisch. Ich musste sogar ein bisschen kämpfen, damit es nicht x86_64-spezifisch wird. Diese UnixRights-Sache ist genau das Richtige. Es sollte mit allem funktionieren, das die Posix-API implementiert, die diese Art von Dingen erlaubt. – Omnifarious
Wenn es Ihnen nichts ausmacht, werde ich die echte Antwort in Ihre Antwort bearbeiten. Wer weiß, ob der Code, den Sie verlinken, für immer da ist? – Omnifarious
@Onmifarious guter Punkt. Es macht mir nichts aus. –