Implementasi IOCTL dalam Go
Soalan:
Dalam menterjemah kod C yang melibatkan ioctl() kepada Go, isu timbul apabila menukar C berikut kod:
#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; }
Kod Go yang sepadan:
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) }
menyebabkan ralat "hujah tidak sah". Apakah isu yang berpotensi dan bagaimanakah ia boleh diselesaikan?
Jawapan:
Untuk membetulkan isu tersebut, pertimbangkan perkara berikut:
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat \'Argumen Tidak Sah\' Semasa Melaksanakan `ioctl()` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!