IOCTL-Implementierung in Golang
Bei der Portierung von Userspace-Code von C nach Golang kann der Umgang mit IOCTL eine Herausforderung sein. Dieser Artikel befasst sich mit einem spezifischen Problem, das beim Versuch, den folgenden C-Code zu konvertieren, aufgetreten ist:
#define MAJOR_NUM 100 #define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *) static int mbox_property(int file_desc, void *buf) { return ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf); }
Das Golang-Äquivalent:
func mBoxProperty(f *os.File, buf [256]int64) { err := Ioctl(f.Fd(), IOWR(100, 0, 8), uintptr(unsafe.Pointer(&buf[0]))) } func Ioctl(fd, op, arg uintptr) error { _, _, ep := syscall.Syscall(syscall.SYS_IOCTL, fd, op, arg) if ep != 0 { return syscall.Errno(ep) } return nil } func IOWR(t, nr, size uintptr) uintptr { return IOC(IocRead|IocWrite, t, nr, size) } func IOC(dir, t, nr, size uintptr) uintptr { return (dir << IocDirshift) | (t << IocTypeshift) | (nr << IocNrshift) | (size << IocSizeshift) }
Das Ausführen dieses Codes führt zu einem Fehler „Ungültiges Argument“. Das Problem liegt darin, wie IOCTL() aufgerufen wird.
Eine Wrapper-Lösung
Das Paket „golang.org/x/sys/unix“ stellt ioctl(2) bereit ) Wrapper. Für diesen speziellen Fall kann der Wrapper unix.IoctlSetInt verwendet werden.
Speicherüberlegungen
Es ist wichtig zu beachten, dass IoctlSetInt und andere IOCTL-Wrapper einen kleinen Speicherpuffer übergeben zum Kernel. Der Garbage Collector von Go erkennt dies nicht und verschiebt möglicherweise den Speicher oder gibt ihn frei, während er noch vom Kernel verwendet wird.
Um dieses Problem zu beheben, sollten Sie die Verwendung einer C-Erweiterung über cgo in Betracht ziehen, um einen Puffer mit malloc zu erstellen. Dadurch wird sichergestellt, dass der Puffer nicht verschoben oder freigegeben wird, wodurch potenzielle Speicherprobleme vermieden werden.
Das obige ist der detaillierte Inhalt vonWie implementiert man IOCTLs in Golang und vermeidet „Ungültige Argumente'-Fehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!