Heim > Backend-Entwicklung > Golang > Wie behebe ich „Ungültige Argumente'-Fehler bei der Implementierung von „ioctl()' in Go?

Wie behebe ich „Ungültige Argumente'-Fehler bei der Implementierung von „ioctl()' in Go?

Barbara Streisand
Freigeben: 2024-11-21 17:22:11
Original
993 Leute haben es durchsucht

How to Resolve

IOCTL-Implementierung in Go

Frage:

Bei der Übersetzung von C-Code mit ioctl() to Go tritt beim Konvertieren des folgenden C-Codes ein Problem auf:

#define MAJOR_NUM 100
#define IOCTL_MBOX_PROPERTY _IOWR(MAJOR_NUM, 0, char *)
static int mbox_property(int file_desc, void *buf){
   int ret_val = ioctl(file_desc, IOCTL_MBOX_PROPERTY, buf);
   return ret_val;
}
Nach dem Login kopieren

Das entsprechende Go Code:

func mBoxProperty(f *os.File, buf [256]int64) {
        err := Ioctl(f.Fd(), IOWR(100, 0, 8), uintptr(unsafe.Pointer(&buf[0])))

        if err != nil {
                log.Fatalln("mBoxProperty() : ", err)
        }

}

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)
}
Nach dem Login kopieren

verursacht den Fehler „Ungültiges Argument“. Was ist das potenzielle Problem und wie kann es gelöst werden?

Antwort:

Um das Problem zu beheben, beachten Sie Folgendes:

  • Verwenden Sie Wrapper für ioctl() in „golang.org/x/sys/unix“. Insbesondere unix.IoctlSetInt könnte für Ihren Anwendungsfall geeignet sein.
  • Seien Sie vorsichtig, wenn Sie kleine Speicherpuffer an den Kernel übergeben. Der Garbage Collector von Go kann Objekte freigeben, die er für ungenutzt hält, und sie möglicherweise auch verschieben. Dies kann zu Diskrepanzen zwischen den Operationen des Kernels und den Erwartungen des Go-Codes führen.
  • Stellen Sie sich vor, eine bescheidene Erweiterung mit cgo an malloc() einen geeigneten Puffer zu schreiben und diese an ioctl zu übergeben. Über malloc() zugewiesener Speicher unterliegt nicht der Garbage Collection, wodurch die oben genannten Probleme gemindert werden.

Das obige ist der detaillierte Inhalt vonWie behebe ich „Ungültige Argumente'-Fehler bei der Implementierung von „ioctl()' in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage