我有一个驱动程序和守护程序,使用 ioctl 的守护程序访问驱动程序,我对_IOR
的第三个参数有些困惑:
#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
我有一些如下代码, ioctl cmd定义:
#define TEST_GET_NUM_A _IOR(TESTIO, 0x01, uint8_t *)
#define TEST_GET_NUM_B _IOR(TESTIO, 0x02, uint8_t)
驱动程序中的ioctl :
case TEST_GET_NUM_A:
rc = put_user(data->num_keys, (uint8_t __user *) arg);
break;
case TEST_GET_NUM_B:
rc = put_user(data->num_keys, (uint8_t __user *) arg);
break;
守护程序中的ioctl :
uint8_t num_keys = 0;
rc = ioctl(fd, TEST_GET_NUM_A/TEST_GET_NUM_B, &num_keys);
if (rc < 0) {
ALOGE("ioctl failed %d", rc);
close(fd);
return rc;
}
TEST_GET_NUM_A
和TEST_GET_NUM_B
都能正常工作,不会发生崩溃。
我的问题是哪一个是正确的,还是两者都正确?
_IOR(type,nr,size)
的大小是ioctl(fd, TEST_GET_NUM_A/B, &num_keys)
中第3个参数的大小,还是从内核传递到用户空间的数据的大小?
答案 0 :(得分:2)
类型的大小成为ioctl数字的一部分。这是为了在内核和用户空间意外使用不同类型(或相同类型的不同定义)时捕获错误。
但是该字段对ioctl的行为没有影响(除非驱动程序明确读取了它)。