Pelaksanaan IOCTL di Golang
Apabila mengalihkan kod ruang pengguna dari C ke Golang, pengendalian IOCTL boleh menjadi satu cabaran. Artikel ini menangani isu khusus yang dihadapi semasa cuba menukar kod C berikut:
#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); }
Persamaan Golang:
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) }
Menjalankan kod ini mengakibatkan ralat "hujah tidak sah". Isunya terletak pada cara IOCTL() dipanggil.
A Wrapper Solution
Pakej "golang.org/x/sys/unix" menyediakan ioctl(2 ) pembalut. Untuk kes khusus ini, pembungkus unix.IoctlSetInt boleh digunakan.
Pertimbangan Memori
Adalah penting untuk ambil perhatian bahawa IoctlSetInt dan pembungkus IOCTL lain menyerahkan penimbal memori kecil kepada kernel. Pengumpul sampah Go tidak mengenali perkara ini, berpotensi mengalihkan atau mendelokasikan memori semasa ia masih digunakan oleh kernel.
Untuk menangani perkara ini, pertimbangkan untuk menggunakan sambungan C melalui cgo untuk mencipta penimbal dengan malloc. Ini memastikan penimbal tidak akan dialihkan atau dibebaskan, mengelakkan kemungkinan masalah ingatan.
Atas ialah kandungan terperinci Bagaimana untuk Melaksanakan IOCTL di Golang dan Mengelakkan Ralat \'Argumen Tidak Sah\'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!