【发布时间】:2019-01-27 12:24:47
【问题描述】:
我正在尝试将 raspberrypi's userspace 代码的一部分从 C 移植到 golang,但我遇到了一个涉及 ioctl() 的程序。
我在使用以下 C 代码时遇到了麻烦
#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;
}
我的 go 等价物是
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)
}
但每当我运行此程序时,我都会收到 invalid argument 错误,我认为这可能是由于我如何调用 IOCTL() 但我不确定,我该如何解决这个问题?
【问题讨论】:
-
这是一个 IOCTL go 示例:github.com/stapelberg/hmgo/blob/master/internal/gpio/reset.go
标签: c linux go raspberry-pi ioctl